1//===- X86Emulation.cpp ---------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "X86.h"
10#include "mcld/LinkerConfig.h"
11#include "mcld/LinkerScript.h"
12#include "mcld/Support/TargetRegistry.h"
13#include "mcld/Target/ELFEmulation.h"
14
15namespace mcld {
16
17static bool MCLDEmulateX86ELF(LinkerScript& pScript, LinkerConfig& pConfig) {
18  if (!MCLDEmulateELF(pScript, pConfig))
19    return false;
20
21  // set up bitclass and endian
22  pConfig.targets().setEndian(TargetOptions::Little);
23  unsigned int bitclass;
24  llvm::Triple::ArchType arch = pConfig.targets().triple().getArch();
25  assert(arch == llvm::Triple::x86 || arch == llvm::Triple::x86_64);
26  if (arch == llvm::Triple::x86 ||
27      pConfig.targets().triple().getEnvironment() == llvm::Triple::GNUX32) {
28    bitclass = 32;
29  } else {
30    bitclass = 64;
31  }
32  pConfig.targets().setBitClass(bitclass);
33
34  // set up target-dependent constraints of attributes
35  pConfig.attribute().constraint().enableWholeArchive();
36  pConfig.attribute().constraint().enableAsNeeded();
37  pConfig.attribute().constraint().setSharedSystem();
38
39  // set up the predefined attributes
40  pConfig.attribute().predefined().unsetWholeArchive();
41  pConfig.attribute().predefined().unsetAsNeeded();
42  pConfig.attribute().predefined().setDynamic();
43  return true;
44}
45
46//===----------------------------------------------------------------------===//
47// emulateX86LD - the help function to emulate X86 ld
48//===----------------------------------------------------------------------===//
49bool emulateX86LD(LinkerScript& pScript, LinkerConfig& pConfig) {
50  if (pConfig.targets().triple().isOSDarwin()) {
51    assert(0 && "MachO linker has not supported yet");
52    return false;
53  }
54  if (pConfig.targets().triple().isOSWindows()) {
55    assert(0 && "COFF linker has not supported yet");
56    return false;
57  }
58
59  return MCLDEmulateX86ELF(pScript, pConfig);
60}
61
62}  // namespace mcld
63
64//===----------------------------------------------------------------------===//
65// X86Emulation
66//===----------------------------------------------------------------------===//
67extern "C" void MCLDInitializeX86Emulation() {
68  // Register the emulation
69  mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_32Target,
70                                          mcld::emulateX86LD);
71  mcld::TargetRegistry::RegisterEmulation(mcld::TheX86_64Target,
72                                          mcld::emulateX86LD);
73}
74