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