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