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