1551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===- AArch64ELFDynamic.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 "AArch64ELFDynamic.h"
10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFFileFormat.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
13551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
15551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
16551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64ELFDynamic::AArch64ELFDynamic(const GNULDBackend& pParent,
17551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                     const LinkerConfig& pConfig)
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : ELFDynamic(pParent, pConfig) {
19551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
20551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
2137b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64ELFDynamic::~AArch64ELFDynamic() {
22551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
23551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64ELFDynamic::reserveTargetEntries(const ELFFileFormat& pFormat) {
25551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // reservePLTGOT
26551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (config().options().hasNow()) {
27551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (pFormat.hasGOT())
28551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      reserveOne(llvm::ELF::DT_PLTGOT);
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  } else {
30551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (pFormat.hasGOTPLT())
31551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      reserveOne(llvm::ELF::DT_PLTGOT);
32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
33551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
34551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64ELFDynamic::applyTargetEntries(const ELFFileFormat& pFormat) {
36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // applyPLTGOT
37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (config().options().hasNow()) {
38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (pFormat.hasGOT())
39551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      applyOne(llvm::ELF::DT_PLTGOT, pFormat.getGOT().addr());
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  } else {
41551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (pFormat.hasGOTPLT())
42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      applyOne(llvm::ELF::DT_PLTGOT, pFormat.getGOTPLT().addr());
43551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
47