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 if (!MCLDEmulateELF(pScript, pConfig))
19 return false;
20
21 // set up bitclass and endian
22 pConfig.targets().setEndian(TargetOptions::Little);
23 pConfig.targets().setBitClass(32);
24
25 // set up target-dependent constraints of attributes
26 pConfig.attribute().constraint().enableWholeArchive();
27 pConfig.attribute().constraint().enableAsNeeded();
28 pConfig.attribute().constraint().setSharedSystem();
29
30 // set up the predefined attributes
31 pConfig.attribute().predefined().unsetWholeArchive();
32 pConfig.attribute().predefined().unsetAsNeeded();
33 pConfig.attribute().predefined().setDynamic();
34
35 // set up section map
36 if (pConfig.options().getScriptList().empty() &&
37 pConfig.codeGenType() != LinkerConfig::Object) {
38 pScript.sectionMap().insert(".ARM.exidx*", ".ARM.exidx");
39 pScript.sectionMap().insert(".ARM.extab*", ".ARM.extab");
40 pScript.sectionMap().insert(".ARM.attributes*", ".ARM.attributes");
41 }
42 return true;
43 }
44
45 //===----------------------------------------------------------------------===//
46 // emulateARMLD - the help function to emulate ARM ld
47 //===----------------------------------------------------------------------===//
emulateARMLD(LinkerScript & pScript,LinkerConfig & pConfig)48 bool emulateARMLD(LinkerScript& pScript, LinkerConfig& pConfig) {
49 if (pConfig.targets().triple().isOSDarwin()) {
50 assert(0 && "MachO linker has not supported yet");
51 return false;
52 }
53 if (pConfig.targets().triple().isOSWindows()) {
54 assert(0 && "COFF linker has not supported yet");
55 return false;
56 }
57
58 return MCLDEmulateARMELF(pScript, pConfig);
59 }
60
61 } // namespace mcld
62
63 //===----------------------------------------------------------------------===//
64 // ARMEmulation
65 //===----------------------------------------------------------------------===//
MCLDInitializeARMEmulation()66 extern "C" void MCLDInitializeARMEmulation() {
67 // Register the emulation
68 mcld::TargetRegistry::RegisterEmulation(mcld::TheARMTarget,
69 mcld::emulateARMLD);
70 mcld::TargetRegistry::RegisterEmulation(mcld::TheThumbTarget,
71 mcld::emulateARMLD);
72 }
73