//===- X86Emulation.cpp ---------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "X86.h" #include "mcld/LinkerConfig.h" #include "mcld/LinkerScript.h" #include "mcld/Support/TargetRegistry.h" #include "mcld/Target/ELFEmulation.h" namespace mcld { static bool MCLDEmulateX86ELF(LinkerScript& pScript, LinkerConfig& pConfig) { if (!MCLDEmulateELF(pScript, pConfig)) return false; // set up bitclass and endian pConfig.targets().setEndian(TargetOptions::Little); unsigned int bitclass; llvm::Triple::ArchType arch = pConfig.targets().triple().getArch(); assert(arch == llvm::Triple::x86 || arch == llvm::Triple::x86_64); if (arch == llvm::Triple::x86 || pConfig.targets().triple().getEnvironment() == llvm::Triple::GNUX32) { bitclass = 32; } else { bitclass = 64; } pConfig.targets().setBitClass(bitclass); // set up target-dependent constraints of attributes pConfig.attribute().constraint().enableWholeArchive(); pConfig.attribute().constraint().enableAsNeeded(); pConfig.attribute().constraint().setSharedSystem(); // set up the predefined attributes pConfig.attribute().predefined().unsetWholeArchive(); pConfig.attribute().predefined().unsetAsNeeded(); pConfig.attribute().predefined().setDynamic(); return true; } //===----------------------------------------------------------------------===// // emulateX86LD - the help function to emulate X86 ld //===----------------------------------------------------------------------===// bool emulateX86LD(LinkerScript& pScript, LinkerConfig& pConfig) { if (pConfig.targets().triple().isOSDarwin()) { assert(0 && "MachO linker has not supported yet"); return false; } if (pConfig.targets().triple().isOSWindows()) { assert(0 && "COFF linker has not supported yet"); return false; } return MCLDEmulateX86ELF(pScript, pConfig); } } // namespace mcld //===----------------------------------------------------------------------===// // X86Emulation //===----------------------------------------------------------------------===// extern "C" void MCLDInitializeX86Emulation() { // Register the emulation mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_32Target, mcld::emulateX86LD); mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_64Target, mcld::emulateX86LD); }