AArch64Emulation.cpp revision 37b74a387bb3993387029859c2d9d051c41c724e
1551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===- AArch64Emulation.cpp -----------------------------------------------===// 2551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 3551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// The MCLinker Project 4551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 5551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// This file is distributed under the University of Illinois Open Source 6551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// License. See LICENSE.TXT for details. 7551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 8551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h" 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerScript.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/TargetRegistry.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFEmulation.h" 14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 15551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesnamespace mcld { 16551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesstatic bool MCLDEmulateAArch64ELF(LinkerScript& pScript, 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines LinkerConfig& pConfig) { 19551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (!MCLDEmulateELF(pScript, pConfig)) 20551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return false; 21551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 22551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set up bitclass and endian 23551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.targets().setEndian(TargetOptions::Little); 24551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.targets().setBitClass(64); 25551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 26551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set up target-dependent constraints of attributes 27551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.attribute().constraint().enableWholeArchive(); 28551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.attribute().constraint().enableAsNeeded(); 29551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.attribute().constraint().setSharedSystem(); 30551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 31551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set up the predefined attributes 32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.attribute().predefined().unsetWholeArchive(); 33551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.attribute().predefined().unsetAsNeeded(); 34551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.attribute().predefined().setDynamic(); 35551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set up section map 37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (pConfig.options().getScriptList().empty() && 38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pConfig.codeGenType() != LinkerConfig::Object) { 39551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pScript.sectionMap().insert(".ARM.attributes*", ".ARM.attributes"); 40551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 41551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 43551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// emulateAArch64LD - the help function to emulate AArch64 ld 46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool emulateAArch64LD(LinkerScript& pScript, LinkerConfig& pConfig) { 48551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (pConfig.targets().triple().isOSDarwin()) { 49551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(0 && "MachO linker has not supported yet"); 50551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return false; 51551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 52551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (pConfig.targets().triple().isOSWindows()) { 53551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(0 && "COFF linker has not supported yet"); 54551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return false; 55551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 56551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 57551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return MCLDEmulateAArch64ELF(pScript, pConfig); 58551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 59551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 61551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 62551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// AArch64Emulation 64551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 65551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesextern "C" void MCLDInitializeAArch64Emulation() { 66551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // Register the emulation 67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines mcld::TargetRegistry::RegisterEmulation(mcld::TheAArch64Target, 68551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines mcld::emulateAArch64LD); 69551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 70