122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- X86Emulation.cpp ---------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include "X86.h" 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h> 11f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LinkerScript.h> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/ELFEmulation.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/TargetRegistry.h> 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesstatic bool MCLDEmulateX86ELF(LinkerScript& pScript, LinkerConfig& pConfig) 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!MCLDEmulateELF(pScript, pConfig)) 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // set up bitclass and endian 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao pConfig.targets().setEndian(TargetOptions::Little); 246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines unsigned int bitclass; 256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Triple::ArchType arch = pConfig.targets().triple().getArch(); 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert (arch == Triple::x86 || arch == Triple::x86_64); 276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (arch == Triple::x86 || 286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines pConfig.targets().triple().getEnvironment() == Triple::GNUX32) { 296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bitclass = 32; 306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines else { 326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bitclass = 64; 336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines pConfig.targets().setBitClass(bitclass); 35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // set up target-dependent constraints of attributes 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().constraint().enableWholeArchive(); 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().constraint().enableAsNeeded(); 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().constraint().setSharedSystem(); 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // set up the predefined attributes 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().predefined().unsetWholeArchive(); 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().predefined().unsetAsNeeded(); 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().predefined().setDynamic(); 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// emulateX86LD - the help function to emulate X86 ld 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool emulateX86LD(LinkerScript& pScript, LinkerConfig& pConfig) 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pConfig.targets().triple().isOSDarwin()) { 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(0 && "MachO linker has not supported yet"); 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pConfig.targets().triple().isOSWindows()) { 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(0 && "COFF linker has not supported yet"); 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return MCLDEmulateX86ELF(pScript, pConfig); 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// X86Emulation 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoextern "C" void MCLDInitializeX86Emulation() { 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Register the emulation 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_32Target, mcld::emulateX86LD); 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_64Target, mcld::emulateX86LD); 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 76