• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- ARMEmulation.cpp ---------------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #include "ARM.h"
10 #include <mcld/LinkerConfig.h>
11 #include <mcld/LinkerScript.h>
12 #include <mcld/Target/ELFEmulation.h>
13 #include <mcld/Support/TargetRegistry.h>
14 
15 namespace mcld {
16 
MCLDEmulateARMELF(LinkerScript & pScript,LinkerConfig & pConfig)17 static bool MCLDEmulateARMELF(LinkerScript& pScript, LinkerConfig& pConfig)
18 {
19   if (!MCLDEmulateELF(pScript, pConfig))
20     return false;
21 
22   // set up bitclass and endian
23   pConfig.targets().setEndian(TargetOptions::Little);
24   pConfig.targets().setBitClass(32);
25 
26   // set up target-dependent constraints of attributes
27   pConfig.attribute().constraint().enableWholeArchive();
28   pConfig.attribute().constraint().enableAsNeeded();
29   pConfig.attribute().constraint().setSharedSystem();
30 
31   // set up the predefined attributes
32   pConfig.attribute().predefined().unsetWholeArchive();
33   pConfig.attribute().predefined().unsetAsNeeded();
34   pConfig.attribute().predefined().setDynamic();
35 
36   // set up section map
37   if (pConfig.options().getScriptList().empty() &&
38       pConfig.codeGenType() != LinkerConfig::Object) {
39     pScript.sectionMap().insert(".ARM.exidx*", ".ARM.exidx");
40     pScript.sectionMap().insert(".ARM.extab*", ".ARM.extab");
41     pScript.sectionMap().insert(".ARM.attributes*", ".ARM.attributes");
42   }
43   return true;
44 }
45 
46 //===----------------------------------------------------------------------===//
47 // emulateARMLD - the help function to emulate ARM ld
48 //===----------------------------------------------------------------------===//
emulateARMLD(LinkerScript & pScript,LinkerConfig & pConfig)49 bool emulateARMLD(LinkerScript& pScript, LinkerConfig& pConfig)
50 {
51   if (pConfig.targets().triple().isOSDarwin()) {
52     assert(0 && "MachO linker has not supported yet");
53     return false;
54   }
55   if (pConfig.targets().triple().isOSWindows()) {
56     assert(0 && "COFF linker has not supported yet");
57     return false;
58   }
59 
60   return MCLDEmulateARMELF(pScript, pConfig);
61 }
62 
63 } // namespace of mcld
64 
65 //===----------------------------------------------------------------------===//
66 // ARMEmulation
67 //===----------------------------------------------------------------------===//
MCLDInitializeARMEmulation()68 extern "C" void MCLDInitializeARMEmulation() {
69   // Register the emulation
70   mcld::TargetRegistry::RegisterEmulation(mcld::TheARMTarget, mcld::emulateARMLD);
71   mcld::TargetRegistry::RegisterEmulation(mcld::TheThumbTarget, mcld::emulateARMLD);
72 }
73 
74