15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ARMLDBackend.h -----------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_ARM_ARMLDBACKEND_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_ARM_ARMLDBACKEND_H_
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "ARMELFDynamic.h"
13a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#include "ARMException.h"
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "ARMGOT.h"
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "ARMPLT.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GNULDBackend.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/OutputRelocSection.h"
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
20cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines#include <memory>
21cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ARMELFAttributeData;
25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass GNUInfo;
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass LinkerConfig;
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// ARMGNULDBackend - linker backend of ARM target of GNU ELF format
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ARMGNULDBackend : public GNULDBackend {
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // max branch offsets for ARM, THUMB, and THUMB2
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) - 2 + 4);
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  ARMGNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~ARMGNULDBackend();
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::vector<llvm::ELF::Elf32_Dyn*> ELF32DynList;
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// initTargetSections - initialize target dependent sections in output.
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// initTargetSymbols - initialize target dependent symbols in output.
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSymbols(IRBuilder& pBuilder, Module& pModule);
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
55d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// initRelocator - create and initialize Relocator.
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
58d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// getRelocator - return relocator.
590dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  const Relocator* getRelocator() const;
60d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Relocator* getRelocator();
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// doPreLayout - Backend can do any needed modification before layout
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doPreLayout(IRBuilder& pBuilder);
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// doPostLayout -Backend can do any needed modification after layout
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doPostLayout(Module& pModule, IRBuilder& pBuilder);
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// dynamic - the dynamic section of the target machine.
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Use co-variant return type to return its own dynamic section.
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMELFDynamic& dynamic();
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// dynamic - the dynamic section of the target machine.
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Use co-variant return type to return its own dynamic section.
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const ARMELFDynamic& dynamic() const;
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// emitSectionData - write out the section data into the memory region.
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// When writers get a LDSection whose kind is LDFileFormat::Target, writers
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// call back target backend to emit the data.
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Backends handle the target-special tables (plt, gp,...) by themselves.
81cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// Backend can put the data of the tables in SectionData directly
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///  - LDSection.getSectionData can get the section data.
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Or, backend can put the data into special data structure
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///  - backend can maintain its own map<LDSection, table> to get the table
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// from given LDSection.
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pSection - the given LDSection
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pConfig - all options in the command line.
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pRegion - the region to write out data
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return the size of the table in the file.
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t emitSectionData(const LDSection& pSection,
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           MemoryRegion& pRegion) const;
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMGOT& getGOT();
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const ARMGOT& getGOT() const;
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMPLT& getPLT();
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const ARMPLT& getPLT() const;
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection& getRelDyn();
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const OutputRelocSection& getRelDyn() const;
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection& getRelPLT();
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const OutputRelocSection& getRelPLT() const;
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ARMELFAttributeData& getAttributeData();
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const ARMELFAttributeData& getAttributeData() const;
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSymbol* getGOTSymbol() { return m_pGOTSymbol; }
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const LDSymbol* getGOTSymbol() const { return m_pGOTSymbol; }
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getTargetSectionOrder - compute the layout order of ARM target sections
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  unsigned int getTargetSectionOrder(const LDSection& pSectHdr) const;
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// finalizeTargetSymbols - finalize the symbol value
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool finalizeTargetSymbols();
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
118a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  /// preMergeSections - hooks to be executed before merging sections
119a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  virtual void preMergeSections(Module& pModule);
120a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
121a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  /// postMergeSections - hooks to be executed after merging sections
122a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  virtual void postMergeSections(Module& pModule);
123a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// mergeSection - merge target dependent sections
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool mergeSection(Module& pModule, const Input& pInput, LDSection& pSection);
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// setUpReachedSectionsForGC - set the reference from section XXX to
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// .ARM.exidx.XXX to make sure GC correctly handle section exidx
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void setUpReachedSectionsForGC(
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      const Module& pModule,
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      GarbageCollection::SectionReachedListMap& pSectReachedListMap) const;
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readSection - read target dependent sections
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readSection(Input& pInput, SectionData& pSD);
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1360dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// mayHaveUnsafeFunctionPointerAccess - check if the section may have unsafe
1370dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// function pointer access
1380dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  bool mayHaveUnsafeFunctionPointerAccess(const LDSection& pSection) const;
1390dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
14037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
1416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void defineGOTSymbol(IRBuilder& pBuilder);
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1430dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// maxFwdBranchOffset
144cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines  int64_t maxFwdBranchOffset() const;
1450dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// maxBwdBranchOffset
146cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines  int64_t maxBwdBranchOffset() const;
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// mayRelax - Backends should override this function if they need relaxation
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool mayRelax() { return true; }
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
151a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  /// relax - the relaxation pass
152a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  virtual bool relax(Module& pModule, IRBuilder& pBuilder);
153a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// doRelax - Backend can orevride this function to add its relaxation
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// implementation. Return true if the output (e.g., .text) is "relaxed"
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// (i.e. layout is changed), and set pFinished to true if everything is fit,
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// otherwise set it to false.
1586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool doRelax(Module& pModule, IRBuilder& pBuilder, bool& pFinished);
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// initTargetStubs
1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initTargetStubs();
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// getRelEntrySize - the size in BYTE of rel type relocation
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  size_t getRelEntrySize() { return 8; }
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// getRelEntrySize - the size in BYTE of rela type relocation
16737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  size_t getRelaEntrySize() {
16837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    assert(0 && "ARM backend with Rela type relocation\n");
16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    return 12;
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// doCreateProgramHdrs - backend can implement this function to create the
17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// target-dependent segments
1746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void doCreateProgramHdrs(Module& pModule);
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
176a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  /// rewriteExceptionSection - rewrite the output .ARM.exidx section.
177a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  void rewriteARMExIdxSection(Module& pModule);
178a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
180d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Relocator* m_pRelocator;
181d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMGOT* m_pGOT;
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMPLT* m_pPLT;
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelDyn - dynamic relocation table of .rel.dyn
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelDyn;
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelPLT - dynamic relocation table of .rel.plt
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelPLT;
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// m_pAttrData - attribute data in public ("aeabi") attribute subsection
19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ARMELFAttributeData* m_pAttrData;
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMELFDynamic* m_pDynamic;
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* m_pGOTSymbol;
19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSymbol* m_pEXIDXStart;
19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSymbol* m_pEXIDXEnd;
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //     variable name           :  ELF
19837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* m_pEXIDX;       // .ARM.exidx
19937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* m_pEXTAB;       // .ARM.extab
20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* m_pAttributes;  // .ARM.attributes
20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  //  LDSection* m_pPreemptMap;      // .ARM.preemptmap
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  //  LDSection* m_pDebugOverlay;    // .ARM.debug_overlay
20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  //  LDSection* m_pOverlayTable;    // .ARM.overlay_table
204a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
205cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines  // m_pExData - exception handling section data structures
206cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines  std::unique_ptr<ARMExData> m_pExData;
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
208cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // TARGET_ARM_ARMLDBACKEND_H_
212