1 //===- X86Emulation.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 "X86.h" 10 #include "mcld/LinkerConfig.h" 11 #include "mcld/LinkerScript.h" 12 #include "mcld/Support/TargetRegistry.h" 13 #include "mcld/Target/ELFEmulation.h" 14 15 namespace mcld { 16 MCLDEmulateX86ELF(LinkerScript & pScript,LinkerConfig & pConfig)17static bool MCLDEmulateX86ELF(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 unsigned int bitclass; 24 llvm::Triple::ArchType arch = pConfig.targets().triple().getArch(); 25 assert(arch == llvm::Triple::x86 || arch == llvm::Triple::x86_64); 26 if (arch == llvm::Triple::x86 || 27 pConfig.targets().triple().getEnvironment() == llvm::Triple::GNUX32) { 28 bitclass = 32; 29 } else { 30 bitclass = 64; 31 } 32 pConfig.targets().setBitClass(bitclass); 33 34 // set up target-dependent constraints of attributes 35 pConfig.attribute().constraint().enableWholeArchive(); 36 pConfig.attribute().constraint().enableAsNeeded(); 37 pConfig.attribute().constraint().setSharedSystem(); 38 39 // set up the predefined attributes 40 pConfig.attribute().predefined().unsetWholeArchive(); 41 pConfig.attribute().predefined().unsetAsNeeded(); 42 pConfig.attribute().predefined().setDynamic(); 43 return true; 44 } 45 46 //===----------------------------------------------------------------------===// 47 // emulateX86LD - the help function to emulate X86 ld 48 //===----------------------------------------------------------------------===// emulateX86LD(LinkerScript & pScript,LinkerConfig & pConfig)49bool emulateX86LD(LinkerScript& pScript, LinkerConfig& pConfig) { 50 if (pConfig.targets().triple().isOSDarwin()) { 51 assert(0 && "MachO linker has not supported yet"); 52 return false; 53 } 54 if (pConfig.targets().triple().isOSWindows()) { 55 assert(0 && "COFF linker has not supported yet"); 56 return false; 57 } 58 59 return MCLDEmulateX86ELF(pScript, pConfig); 60 } 61 62 } // namespace mcld 63 64 //===----------------------------------------------------------------------===// 65 // X86Emulation 66 //===----------------------------------------------------------------------===// MCLDInitializeX86Emulation()67extern "C" void MCLDInitializeX86Emulation() { 68 // Register the emulation 69 mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_32Target, 70 mcld::emulateX86LD); 71 mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_64Target, 72 mcld::emulateX86LD); 73 } 74