122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- MipsEmulation.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 "Mips.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerScript.h" 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/TargetRegistry.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFEmulation.h" 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesstatic bool MCLDEmulateMipsELF(LinkerScript& pScript, LinkerConfig& pConfig) { 18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!MCLDEmulateELF(pScript, pConfig)) 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // set up bitclass and endian 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao pConfig.targets().setEndian(TargetOptions::Little); 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::Triple::ArchType arch = pConfig.targets().triple().getArch(); 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(arch == llvm::Triple::mipsel || arch == llvm::Triple::mips64el); 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines unsigned bitclass = arch == llvm::Triple::mipsel ? 32 : 64; 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pConfig.targets().setBitClass(bitclass); 28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // set up target-dependent constraints of attributes 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().constraint().enableWholeArchive(); 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().constraint().enableAsNeeded(); 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().constraint().setSharedSystem(); 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // set up the predefined attributes 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().predefined().unsetWholeArchive(); 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().predefined().unsetAsNeeded(); 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pConfig.attribute().predefined().setDynamic(); 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// emulateMipsLD - the help function to emulate Mips ld 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool emulateMipsLD(LinkerScript& pScript, LinkerConfig& pConfig) { 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pConfig.targets().triple().isOSDarwin()) { 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(0 && "MachO linker has not supported yet"); 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pConfig.targets().triple().isOSWindows()) { 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(0 && "COFF linker has not supported yet"); 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return MCLDEmulateMipsELF(pScript, pConfig); 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// MipsEmulation 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoextern "C" void MCLDInitializeMipsEmulation() { 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::TargetRegistry::RegisterEmulation(mcld::TheMipselTarget, 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::emulateMipsLD); 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::TargetRegistry::RegisterEmulation(mcld::TheMips64elTarget, 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::emulateMipsLD); 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 68