1551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===- AArch64Emulation.cpp -----------------------------------------------===//
2551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//
3551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//                     The MCLinker Project
4551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//
5551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// This file is distributed under the University of Illinois Open Source
6551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// License. See LICENSE.TXT for details.
7551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//
8551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerScript.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/TargetRegistry.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFEmulation.h"
14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
15551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesnamespace mcld {
16551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesstatic bool MCLDEmulateAArch64ELF(LinkerScript& pScript,
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  LinkerConfig& pConfig) {
19551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (!MCLDEmulateELF(pScript, pConfig))
20551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return false;
21551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
22551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // set up bitclass and endian
23551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.targets().setEndian(TargetOptions::Little);
24551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.targets().setBitClass(64);
25551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
26551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // set up target-dependent constraints of attributes
27551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.attribute().constraint().enableWholeArchive();
28551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.attribute().constraint().enableAsNeeded();
29551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.attribute().constraint().setSharedSystem();
30551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
31551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // set up the predefined attributes
32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.attribute().predefined().unsetWholeArchive();
33551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.attribute().predefined().unsetAsNeeded();
34551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  pConfig.attribute().predefined().setDynamic();
35551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // set up section map
37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (pConfig.options().getScriptList().empty() &&
38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      pConfig.codeGenType() != LinkerConfig::Object) {
39551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    pScript.sectionMap().insert(".ARM.attributes*", ".ARM.attributes");
40551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
41551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
43551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// emulateAArch64LD - the help function to emulate AArch64 ld
46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool emulateAArch64LD(LinkerScript& pScript, LinkerConfig& pConfig) {
48551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (pConfig.targets().triple().isOSDarwin()) {
49551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(0 && "MachO linker has not supported yet");
50551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return false;
51551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
52551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (pConfig.targets().triple().isOSWindows()) {
53551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(0 && "COFF linker has not supported yet");
54551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return false;
55551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
56551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
57551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return MCLDEmulateAArch64ELF(pScript, pConfig);
58551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
59551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
61551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
62551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// AArch64Emulation
64551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
65551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesextern "C" void MCLDInitializeAArch64Emulation() {
66551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // Register the emulation
67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  mcld::TargetRegistry::RegisterEmulation(mcld::TheAArch64Target,
68551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                          mcld::emulateAArch64LD);
69551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
70