• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- AArch64Emulation.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 "AArch64.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 
MCLDEmulateAArch64ELF(LinkerScript & pScript,LinkerConfig & pConfig)17 static bool MCLDEmulateAArch64ELF(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(64);
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.attributes*", ".ARM.attributes");
40   }
41   return true;
42 }
43 
44 //===----------------------------------------------------------------------===//
45 // emulateAArch64LD - the help function to emulate AArch64 ld
46 //===----------------------------------------------------------------------===//
emulateAArch64LD(LinkerScript & pScript,LinkerConfig & pConfig)47 bool emulateAArch64LD(LinkerScript& pScript, LinkerConfig& pConfig)
48 {
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 MCLDEmulateAArch64ELF(pScript, pConfig);
59 }
60 
61 } // namespace of mcld
62 
63 //===----------------------------------------------------------------------===//
64 // AArch64Emulation
65 //===----------------------------------------------------------------------===//
MCLDInitializeAArch64Emulation()66 extern "C" void MCLDInitializeAArch64Emulation() {
67   // Register the emulation
68   mcld::TargetRegistry::RegisterEmulation(mcld::TheAArch64Target,
69                                           mcld::emulateAArch64LD);
70 }
71 
72