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)17static 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)47bool 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()66extern "C" void MCLDInitializeAArch64Emulation() { 67 // Register the emulation 68 mcld::TargetRegistry::RegisterEmulation(mcld::TheAArch64Target, 69 mcld::emulateAArch64LD); 70 } 71 72