1//===- AArch64Emulation.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 "AArch64.h"
10#include <mcld/LinkerConfig.h>
11#include <mcld/LinkerScript.h>
12#include <mcld/Target/ELFEmulation.h>
13#include <mcld/Support/TargetRegistry.h>
14
15namespace mcld {
16
17static bool MCLDEmulateAArch64ELF(LinkerScript& pScript, LinkerConfig& pConfig)
18{
19  if (!MCLDEmulateELF(pScript, pConfig))
20    return false;
21
22  // set up bitclass and endian
23  pConfig.targets().setEndian(TargetOptions::Little);
24  pConfig.targets().setBitClass(64);
25
26  // set up target-dependent constraints of attributes
27  pConfig.attribute().constraint().enableWholeArchive();
28  pConfig.attribute().constraint().enableAsNeeded();
29  pConfig.attribute().constraint().setSharedSystem();
30
31  // set up the predefined attributes
32  pConfig.attribute().predefined().unsetWholeArchive();
33  pConfig.attribute().predefined().unsetAsNeeded();
34  pConfig.attribute().predefined().setDynamic();
35
36  // set up section map
37  if (pConfig.options().getScriptList().empty() &&
38      pConfig.codeGenType() != LinkerConfig::Object) {
39    pScript.sectionMap().insert(".ARM.attributes*", ".ARM.attributes");
40  }
41  return true;
42}
43
44//===----------------------------------------------------------------------===//
45// emulateAArch64LD - the help function to emulate AArch64 ld
46//===----------------------------------------------------------------------===//
47bool emulateAArch64LD(LinkerScript& pScript, LinkerConfig& pConfig)
48{
49  if (pConfig.targets().triple().isOSDarwin()) {
50    assert(0 && "MachO linker has not supported yet");
51    return false;
52  }
53  if (pConfig.targets().triple().isOSWindows()) {
54    assert(0 && "COFF linker has not supported yet");
55    return false;
56  }
57
58  return MCLDEmulateAArch64ELF(pScript, pConfig);
59}
60
61} // namespace of mcld
62
63//===----------------------------------------------------------------------===//
64// AArch64Emulation
65//===----------------------------------------------------------------------===//
66extern "C" void MCLDInitializeAArch64Emulation() {
67  // Register the emulation
68  mcld::TargetRegistry::RegisterEmulation(mcld::TheAArch64Target,
69                                          mcld::emulateAArch64LD);
70}
71
72