From fa89218a438c0fcafb40775bdc04dbe95c59fba3 Mon Sep 17 00:00:00 2001 From: Charles Davis Date: Thu, 19 May 2011 02:47:23 +0000 Subject: [PATCH] Fix build issues with headers, which I discovered by actually using them. Also, convert all the inline functions on UnwindInfo into methods. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131622 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCWin64EH.h | 6 ++--- include/llvm/Support/Win64EH.h | 48 ++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/include/llvm/MC/MCWin64EH.h b/include/llvm/MC/MCWin64EH.h index 7495e4fd0e8..b7513c8867a 100644 --- a/include/llvm/MC/MCWin64EH.h +++ b/include/llvm/MC/MCWin64EH.h @@ -33,12 +33,12 @@ namespace llvm { MachineLocation Source; public: MCWin64EHInstruction(OpType Op, unsigned Register) - : Operation(Op), Offset(0), Destination(0), Source(S) { + : Operation(Op), Offset(0), Destination(0), Source(Register) { assert(Op == Win64EH::UOP_PushNonVol); } MCWin64EHInstruction(unsigned Size) : Operation(Size>128 ? Win64EH::UOP_AllocLarge : Win64EH::UOP_AllocSmall), - Offset(size) { } + Offset(Size) { } MCWin64EHInstruction(unsigned Register, unsigned Off) : Operation(Win64EH::UOP_SetFPReg), Offset(Off), Destination(Register) { } MCWin64EHInstruction(OpType Op, const MachineLocation &D, @@ -64,7 +64,7 @@ namespace llvm { struct MCWin64EHUnwindInfo { MCWin64EHUnwindInfo() : Begin(0), End(0), ExceptionHandler(0), Lsda(0), Function(0), UnwindOnly(false), LsdaSize(0), - PrologSize(0), LastFrameInst(-1), Chained(false) + PrologSize(0), LastFrameInst(-1), Chained(false), Instructions() {} MCSymbol *Begin; MCSymbol *End; diff --git a/include/llvm/Support/Win64EH.h b/include/llvm/Support/Win64EH.h index f989364e06f..17d416fe0e7 100644 --- a/include/llvm/Support/Win64EH.h +++ b/include/llvm/Support/Win64EH.h @@ -40,7 +40,7 @@ union UnwindCode { uint8_t codeOffset; uint8_t unwindOp:4, opInfo:4; - }; + } u; uint16_t frameOffset; }; @@ -56,6 +56,13 @@ enum { UNW_ChainInfo = 0x04 }; +/// RuntimeFunction - An entry in the table of functions with unwind info. +struct RuntimeFunction { + uint64_t startAddress; + uint64_t endAddress; + uint64_t unwindInfoOffset; +}; + /// UnwindInfo - An entry in the exception table. struct UnwindInfo { uint8_t version:3, @@ -65,30 +72,25 @@ struct UnwindInfo { uint8_t frameRegister:4, frameOffset:4; UnwindCode unwindCodes[1]; + + void *getLanguageSpecificData() { + return reinterpret_cast(&unwindCodes[(numCodes+1) & ~1]); + } + uint64_t getLanguageSpecificHandlerOffset() { + return *reinterpret_cast(getLanguageSpecificData()); + } + void setLanguageSpecificHandlerOffset(uint64_t offset) { + *reinterpret_cast(getLanguageSpecificData()) = offset; + } + RuntimeFunction *getChainedFunctionEntry() { + return reinterpret_cast(getLanguageSpecificData()); + } + void *getExceptionData() { + return reinterpret_cast(reinterpret_cast( + getLanguageSpecificData())+1); + } }; -inline UnwindCode &getUnwindCodeEntry(UnwindInfo &info, uint32_t index) { - return info.unwindCodes[index]; -} -inline void *getLanguageSpecificData(UnwindInfo &info) { - return reinterpret_cast(&getUnwindCodeEntry(info,info.numCodes+1)&~1); -} -inline uint64_t getLanguageSpecificHandlerOffset(UnwindInfo &info) { - return *reinterpret_cast(getLangaugeSpecificData(info)); -} -inline void setLanguageSpecificHandlerOffset(UnwindInfo &info, uint64_t offset){ - *reinterpret_cast(getLanguageSpecificData(info)) = offset; -} -inline uint64_t getChainedFunctionEntryOffset(UnwindInfo &info) { - return *reinterpret_cast(getLanguageSpecificData(info)); -} -inline void setChainedFunctionEntryOffset(UnwindInfo &info, uint64_t offset) { - *reinterpret_cast(getLanguageSpecificData(info)) = offset; -} -inline void *getExceptionData(UnwindInfo &info) { - return reinterpret_cast(reinterpret_cast( - getLanguageSpecificData(info))+1); -} } // End of namespace Win64EH } // End of namespace llvm