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