[llvm] r343089 - [AArch64] - Return address signing dwarf support
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 26 05:59:32 PDT 2018
This caused the DebugInfo/Sparc/gnu-window-save.ll test to fail. See
e.g. http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/7638
and many of the other bots.
I've reverted in r343103.
On Wed, Sep 26, 2018 at 12:14 PM, Luke Cheeseman via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: lukecheeseman
> Date: Wed Sep 26 03:14:15 2018
> New Revision: 343089
>
> URL: http://llvm.org/viewvc/llvm-project?rev=343089&view=rev
> Log:
> [AArch64] - Return address signing dwarf support
>
> Functions that have signed return addresses need additional dwarf support:
> - After signing the LR, and before authenticating it, the LR register is in a
> state the is unusable by a debugger or unwinder
> - To account for this a new directive, .cfi_negate_ra_state, is added
> - This directive says the signed state of the LR register has now changed,
> i.e. unsigned -> signed or signed -> unsigned
> - This directive has the same CFA code as the SPARC directive GNU_window_save
> (0x2d), adding a macro to account for multiply defined codes
> - This patch matches the gcc implementation of this support:
> https://patchwork.ozlabs.org/patch/800271/
>
> Differential Revision: https://reviews.llvm.org/D50136
>
>
> Modified:
> llvm/trunk/include/llvm/BinaryFormat/Dwarf.def
> llvm/trunk/include/llvm/BinaryFormat/Dwarf.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
> llvm/trunk/include/llvm/MC/MCDwarf.h
> llvm/trunk/include/llvm/MC/MCStreamer.h
> llvm/trunk/lib/BinaryFormat/Dwarf.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
> llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp
> llvm/trunk/lib/CodeGen/MIRParser/MILexer.h
> llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp
> llvm/trunk/lib/CodeGen/MachineOperand.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
> llvm/trunk/lib/MC/MCAsmStreamer.cpp
> llvm/trunk/lib/MC/MCDwarf.cpp
> llvm/trunk/lib/MC/MCStreamer.cpp
> llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp
> llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
> llvm/trunk/test/CodeGen/AArch64/sign-return-address.ll
> llvm/trunk/test/CodeGen/MIR/AArch64/cfi.mir
> llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> llvm/trunk/tools/llvm-readobj/DwarfCFIEHPrinter.h
> llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
>
> Modified: llvm/trunk/include/llvm/BinaryFormat/Dwarf.def
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BinaryFormat/Dwarf.def?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/BinaryFormat/Dwarf.def (original)
> +++ llvm/trunk/include/llvm/BinaryFormat/Dwarf.def Wed Sep 26 03:14:15 2018
> @@ -18,7 +18,8 @@
> defined HANDLE_DW_VIRTUALITY || defined HANDLE_DW_DEFAULTED || \
> defined HANDLE_DW_CC || defined HANDLE_DW_LNS || defined HANDLE_DW_LNE || \
> defined HANDLE_DW_LNCT || defined HANDLE_DW_MACRO || \
> - defined HANDLE_DW_RLE || defined HANDLE_DW_CFA || \
> + defined HANDLE_DW_RLE || \
> + (defined HANDLE_DW_CFA && defined HANDLE_DW_CFA_PRED) || \
> defined HANDLE_DW_APPLE_PROPERTY || defined HANDLE_DW_UT || \
> defined HANDLE_DWARF_SECTION || defined HANDLE_DW_IDX || \
> defined HANDLE_DW_END)
> @@ -85,6 +86,10 @@
> #define HANDLE_DW_CFA(ID, NAME)
> #endif
>
> +#ifndef HANDLE_DW_CFA_PRED
> +#define HANDLE_DW_CFA_PRED(ID, NAME, PRED)
> +#endif
> +
> #ifndef HANDLE_DW_APPLE_PROPERTY
> #define HANDLE_DW_APPLE_PROPERTY(ID, NAME)
> #endif
> @@ -831,9 +836,10 @@ HANDLE_DW_CFA(0x14, val_offset)
> HANDLE_DW_CFA(0x15, val_offset_sf)
> HANDLE_DW_CFA(0x16, val_expression)
> // Vendor extensions:
> -HANDLE_DW_CFA(0x1d, MIPS_advance_loc8)
> -HANDLE_DW_CFA(0x2d, GNU_window_save)
> -HANDLE_DW_CFA(0x2e, GNU_args_size)
> +HANDLE_DW_CFA_PRED(0x1d, MIPS_advance_loc8, SELECT_MIPS64)
> +HANDLE_DW_CFA_PRED(0x2d, GNU_window_save, SELECT_SPARC64)
> +HANDLE_DW_CFA_PRED(0x2d, AARCH64_negate_ra_state, SELECT_AARCH64)
> +HANDLE_DW_CFA_PRED(0x2e, GNU_args_size, SELECT_X86)
>
> // Apple Objective-C Property Attributes.
> // Keep this list in sync with clang's DeclSpec.h ObjCPropertyAttributeKind!
> @@ -915,6 +921,7 @@ HANDLE_DW_IDX(0x05, type_hash)
> #undef HANDLE_DW_MACRO
> #undef HANDLE_DW_RLE
> #undef HANDLE_DW_CFA
> +#undef HANDLE_DW_CFA_PRED
> #undef HANDLE_DW_APPLE_PROPERTY
> #undef HANDLE_DW_UT
> #undef HANDLE_DWARF_SECTION
>
> Modified: llvm/trunk/include/llvm/BinaryFormat/Dwarf.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BinaryFormat/Dwarf.h?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/BinaryFormat/Dwarf.h (original)
> +++ llvm/trunk/include/llvm/BinaryFormat/Dwarf.h Wed Sep 26 03:14:15 2018
> @@ -26,6 +26,7 @@
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/Format.h"
> #include "llvm/Support/FormatVariadicDetails.h"
> +#include "llvm/ADT/Triple.h"
>
> namespace llvm {
> class StringRef;
> @@ -272,6 +273,7 @@ enum RangeListEntries {
> /// Call frame instruction encodings.
> enum CallFrameInfo {
> #define HANDLE_DW_CFA(ID, NAME) DW_CFA_##NAME = ID,
> +#define HANDLE_DW_CFA_PRED(ID, NAME, ARCH) DW_CFA_##NAME = ID,
> #include "llvm/BinaryFormat/Dwarf.def"
> DW_CFA_extended = 0x00,
>
> @@ -430,7 +432,7 @@ StringRef LNStandardString(unsigned Stan
> StringRef LNExtendedString(unsigned Encoding);
> StringRef MacinfoString(unsigned Encoding);
> StringRef RangeListEncodingString(unsigned Encoding);
> -StringRef CallFrameString(unsigned Encoding);
> +StringRef CallFrameString(unsigned Encoding, Triple::ArchType Arch);
> StringRef ApplePropertyString(unsigned);
> StringRef UnitTypeString(unsigned);
> StringRef AtomTypeString(unsigned Atom);
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h Wed Sep 26 03:14:15 2018
> @@ -90,6 +90,7 @@ class DWARFContext : public DIContext {
> bool CheckedForDWP = false;
> std::string DWPName;
>
> + Triple::ArchType Arch;
> std::unique_ptr<MCRegisterInfo> RegInfo;
>
> /// Read compile units from the debug_info section (if necessary)
> @@ -341,7 +342,7 @@ public:
> /// Loads register info for the architecture of the provided object file.
> /// Improves readability of dumped DWARF expressions. Requires the caller to
> /// have initialized the relevant target descriptions.
> - Error loadRegisterInfo(const object::ObjectFile &Obj);
> + Error loadArchitectureInfo(const object::ObjectFile &Obj);
>
> /// Get address size from CUs.
> /// TODO: refactor compile_units() to make this const.
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h Wed Sep 26 03:14:15 2018
> @@ -13,6 +13,7 @@
> #include "llvm/ADT/ArrayRef.h"
> #include "llvm/ADT/iterator.h"
> #include "llvm/ADT/SmallString.h"
> +#include "llvm/ADT/Triple.h"
> #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
> #include "llvm/DebugInfo/DWARF/DWARFExpression.h"
> #include "llvm/Support/Error.h"
> @@ -59,9 +60,11 @@ public:
> unsigned size() const { return (unsigned)Instructions.size(); }
> bool empty() const { return Instructions.empty(); }
>
> - CFIProgram(uint64_t CodeAlignmentFactor, int64_t DataAlignmentFactor)
> + CFIProgram(uint64_t CodeAlignmentFactor, int64_t DataAlignmentFactor,
> + Triple::ArchType Arch)
> : CodeAlignmentFactor(CodeAlignmentFactor),
> - DataAlignmentFactor(DataAlignmentFactor) {}
> + DataAlignmentFactor(DataAlignmentFactor),
> + Arch(Arch) {}
>
> /// Parse and store a sequence of CFI instructions from Data,
> /// starting at *Offset and ending at EndOffset. *Offset is updated
> @@ -76,6 +79,7 @@ private:
> std::vector<Instruction> Instructions;
> const uint64_t CodeAlignmentFactor;
> const int64_t DataAlignmentFactor;
> + Triple::ArchType Arch;
>
> /// Convenience method to add a new instruction with the given opcode.
> void addInstruction(uint8_t Opcode) {
> @@ -130,8 +134,9 @@ public:
> enum FrameKind { FK_CIE, FK_FDE };
>
> FrameEntry(FrameKind K, uint64_t Offset, uint64_t Length, uint64_t CodeAlign,
> - int64_t DataAlign)
> - : Kind(K), Offset(Offset), Length(Length), CFIs(CodeAlign, DataAlign) {}
> + int64_t DataAlign, Triple::ArchType Arch)
> + : Kind(K), Offset(Offset), Length(Length),
> + CFIs(CodeAlign, DataAlign, Arch) {}
>
> virtual ~FrameEntry() {}
>
> @@ -168,9 +173,9 @@ public:
> int64_t DataAlignmentFactor, uint64_t ReturnAddressRegister,
> SmallString<8> AugmentationData, uint32_t FDEPointerEncoding,
> uint32_t LSDAPointerEncoding, Optional<uint64_t> Personality,
> - Optional<uint32_t> PersonalityEnc)
> + Optional<uint32_t> PersonalityEnc, Triple::ArchType Arch)
> : FrameEntry(FK_CIE, Offset, Length, CodeAlignmentFactor,
> - DataAlignmentFactor),
> + DataAlignmentFactor, Arch),
> Version(Version), Augmentation(std::move(Augmentation)),
> AddressSize(AddressSize), SegmentDescriptorSize(SegmentDescriptorSize),
> CodeAlignmentFactor(CodeAlignmentFactor),
> @@ -224,10 +229,11 @@ public:
> // is obtained lazily once it's actually required.
> FDE(uint64_t Offset, uint64_t Length, int64_t LinkedCIEOffset,
> uint64_t InitialLocation, uint64_t AddressRange, CIE *Cie,
> - Optional<uint64_t> LSDAAddress)
> + Optional<uint64_t> LSDAAddress, Triple::ArchType Arch)
> : FrameEntry(FK_FDE, Offset, Length,
> Cie ? Cie->getCodeAlignmentFactor() : 0,
> - Cie ? Cie->getDataAlignmentFactor() : 0),
> + Cie ? Cie->getDataAlignmentFactor() : 0,
> + Arch),
> LinkedCIEOffset(LinkedCIEOffset), InitialLocation(InitialLocation),
> AddressRange(AddressRange), LinkedCIE(Cie), LSDAAddress(LSDAAddress) {}
>
> @@ -256,6 +262,7 @@ private:
>
> /// A parsed .debug_frame or .eh_frame section
> class DWARFDebugFrame {
> + const Triple::ArchType Arch;
> // True if this is parsing an eh_frame section.
> const bool IsEH;
> // Not zero for sane pointer values coming out of eh_frame
> @@ -272,7 +279,8 @@ public:
> // it is a .debug_frame section. EHFrameAddress should be different
> // than zero for correct parsing of .eh_frame addresses when they
> // use a PC-relative encoding.
> - DWARFDebugFrame(bool IsEH = false, uint64_t EHFrameAddress = 0);
> + DWARFDebugFrame(Triple::ArchType Arch,
> + bool IsEH = false, uint64_t EHFrameAddress = 0);
> ~DWARFDebugFrame();
>
> /// Dump the section data into the given stream.
>
> Modified: llvm/trunk/include/llvm/MC/MCDwarf.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCDwarf.h?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCDwarf.h (original)
> +++ llvm/trunk/include/llvm/MC/MCDwarf.h Wed Sep 26 03:14:15 2018
> @@ -430,6 +430,7 @@ public:
> OpUndefined,
> OpRegister,
> OpWindowSave,
> + OpNegateRAState,
> OpGnuArgsSize
> };
>
> @@ -509,6 +510,11 @@ public:
> return MCCFIInstruction(OpWindowSave, L, 0, 0, "");
> }
>
> + /// .cfi_negate_ra_state AArch64 negate RA state.
> + static MCCFIInstruction createNegateRAState(MCSymbol *L) {
> + return MCCFIInstruction(OpNegateRAState, L, 0, 0, "");
> + }
> +
> /// .cfi_restore says that the rule for Register is now the same as it
> /// was at the beginning of the function, after all initial instructions added
> /// by .cfi_startproc were executed.
>
> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Wed Sep 26 03:14:15 2018
> @@ -891,6 +891,7 @@ public:
> virtual void EmitCFIUndefined(int64_t Register);
> virtual void EmitCFIRegister(int64_t Register1, int64_t Register2);
> virtual void EmitCFIWindowSave();
> + virtual void EmitCFINegateRAState();
>
> virtual void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc = SMLoc());
> virtual void EmitWinCFIEndProc(SMLoc Loc = SMLoc());
>
> Modified: llvm/trunk/lib/BinaryFormat/Dwarf.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/BinaryFormat/Dwarf.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/BinaryFormat/Dwarf.cpp (original)
> +++ llvm/trunk/lib/BinaryFormat/Dwarf.cpp Wed Sep 26 03:14:15 2018
> @@ -13,6 +13,7 @@
>
> #include "llvm/BinaryFormat/Dwarf.h"
> #include "llvm/ADT/StringSwitch.h"
> +#include "llvm/ADT/Triple.h"
> #include "llvm/Support/ErrorHandling.h"
>
> using namespace llvm;
> @@ -455,14 +456,31 @@ StringRef llvm::dwarf::RangeListEncoding
> }
> }
>
> -StringRef llvm::dwarf::CallFrameString(unsigned Encoding) {
> +StringRef llvm::dwarf::CallFrameString(unsigned Encoding,
> + Triple::ArchType Arch) {
> +#define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64)
> +#define SELECT_MIPS64 Arch == llvm::Triple::mips64
> +#define SELECT_SPARC64 Arch == llvm::Triple::sparcv9
> +#define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64)
> +#define HANDLE_DW_CFA(ID, NAME)
> +#define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \
> + if (ID == Encoding && PRED) \
> + return "DW_CFA_" #NAME;
> +#include "llvm/BinaryFormat/Dwarf.def"
> +
> switch (Encoding) {
> default:
> return StringRef();
> +#define HANDLE_DW_CFA_PRED(ID, NAME, PRED)
> #define HANDLE_DW_CFA(ID, NAME) \
> case DW_CFA_##NAME: \
> return "DW_CFA_" #NAME;
> #include "llvm/BinaryFormat/Dwarf.def"
> +
> +#undef SELECT_X86
> +#undef SELECT_SPARC64
> +#undef SELECT_MIPS64
> +#undef SELECT_AARCH64
> }
> }
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp Wed Sep 26 03:14:15 2018
> @@ -212,6 +212,9 @@ void AsmPrinter::emitCFIInstruction(cons
> case MCCFIInstruction::OpWindowSave:
> OutStreamer->EmitCFIWindowSave();
> break;
> + case MCCFIInstruction::OpNegateRAState:
> + OutStreamer->EmitCFINegateRAState();
> + break;
> case MCCFIInstruction::OpSameValue:
> OutStreamer->EmitCFISameValue(Inst.getRegister());
> break;
>
> Modified: llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp Wed Sep 26 03:14:15 2018
> @@ -207,6 +207,7 @@ void CFIInstrInserter::calculateOutgoing
> case MCCFIInstruction::OpUndefined:
> case MCCFIInstruction::OpRegister:
> case MCCFIInstruction::OpWindowSave:
> + case MCCFIInstruction::OpNegateRAState:
> case MCCFIInstruction::OpGnuArgsSize:
> break;
> }
>
> Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp Wed Sep 26 03:14:15 2018
> @@ -220,6 +220,7 @@ static MIToken::TokenKind getIdentifierK
> .Case("undefined", MIToken::kw_cfi_undefined)
> .Case("register", MIToken::kw_cfi_register)
> .Case("window_save", MIToken::kw_cfi_window_save)
> + .Case("negate_ra_sign_state", MIToken::kw_cfi_aarch64_negate_ra_sign_state)
> .Case("blockaddress", MIToken::kw_blockaddress)
> .Case("intrinsic", MIToken::kw_intrinsic)
> .Case("target-index", MIToken::kw_target_index)
>
> Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.h?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIRParser/MILexer.h (original)
> +++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.h Wed Sep 26 03:14:15 2018
> @@ -89,6 +89,7 @@ struct MIToken {
> kw_cfi_restore_state,
> kw_cfi_undefined,
> kw_cfi_window_save,
> + kw_cfi_aarch64_negate_ra_sign_state,
> kw_blockaddress,
> kw_intrinsic,
> kw_target_index,
>
> Modified: llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp Wed Sep 26 03:14:15 2018
> @@ -1816,6 +1816,9 @@ bool MIParser::parseCFIOperand(MachineOp
> case MIToken::kw_cfi_window_save:
> CFIIndex = MF.addFrameInst(MCCFIInstruction::createWindowSave(nullptr));
> break;
> + case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
> + CFIIndex = MF.addFrameInst(MCCFIInstruction::createNegateRAState(nullptr));
> + break;
> case MIToken::kw_cfi_escape: {
> std::string Values;
> if (parseCFIEscapeValues(Values))
> @@ -2108,6 +2111,7 @@ bool MIParser::parseMachineOperand(Machi
> case MIToken::kw_cfi_restore_state:
> case MIToken::kw_cfi_undefined:
> case MIToken::kw_cfi_window_save:
> + case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
> return parseCFIOperand(Dest);
> case MIToken::kw_blockaddress:
> return parseBlockAddressOperand(Dest);
>
> Modified: llvm/trunk/lib/CodeGen/MachineOperand.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineOperand.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineOperand.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineOperand.cpp Wed Sep 26 03:14:15 2018
> @@ -696,6 +696,11 @@ static void printCFI(raw_ostream &OS, co
> if (MCSymbol *Label = CFI.getLabel())
> MachineOperand::printSymbol(OS, *Label);
> break;
> + case MCCFIInstruction::OpNegateRAState:
> + OS << "negate_ra_sign_state ";
> + if (MCSymbol *Label = CFI.getLabel())
> + MachineOperand::printSymbol(OS, *Label);
> + break;
> default:
> // TODO: Print the other CFI Operations.
> OS << "<unserializable cfi directive>";
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp Wed Sep 26 03:14:15 2018
> @@ -724,7 +724,7 @@ const DWARFDebugFrame *DWARFContext::get
> // http://lists.dwarfstd.org/htdig.cgi/dwarf-discuss-dwarfstd.org/2011-December/001173.html
> DWARFDataExtractor debugFrameData(DObj->getDebugFrameSection(),
> isLittleEndian(), DObj->getAddressSize());
> - DebugFrame.reset(new DWARFDebugFrame(false /* IsEH */));
> + DebugFrame.reset(new DWARFDebugFrame(Arch, false /* IsEH */));
> DebugFrame->parse(debugFrameData);
> return DebugFrame.get();
> }
> @@ -735,7 +735,7 @@ const DWARFDebugFrame *DWARFContext::get
>
> DWARFDataExtractor debugFrameData(DObj->getEHFrameSection(), isLittleEndian(),
> DObj->getAddressSize());
> - DebugFrame.reset(new DWARFDebugFrame(true /* IsEH */));
> + DebugFrame.reset(new DWARFDebugFrame(Arch, true /* IsEH */));
> DebugFrame->parse(debugFrameData);
> return DebugFrame.get();
> }
> @@ -1581,9 +1581,11 @@ DWARFContext::create(const StringMap<std
> return llvm::make_unique<DWARFContext>(std::move(DObj), "");
> }
>
> -Error DWARFContext::loadRegisterInfo(const object::ObjectFile &Obj) {
> +Error DWARFContext::loadArchitectureInfo(const object::ObjectFile &Obj) {
> // Detect the architecture from the object file. We usually don't need OS
> // info to lookup a target and create register info.
> + Arch = Triple::ArchType(Obj.getArch());
> +
> Triple TT;
> TT.setArch(Triple::ArchType(Obj.getArch()));
> TT.setVendor(Triple::UnknownVendor);
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp Wed Sep 26 03:14:15 2018
> @@ -225,7 +225,7 @@ void CFIProgram::printOperand(raw_ostrea
> switch (Type) {
> case OT_Unset: {
> OS << " Unsupported " << (OperandIdx ? "second" : "first") << " operand to";
> - auto OpcodeName = CallFrameString(Opcode);
> + auto OpcodeName = CallFrameString(Opcode, Arch);
> if (!OpcodeName.empty())
> OS << " " << OpcodeName;
> else
> @@ -279,7 +279,7 @@ void CFIProgram::dump(raw_ostream &OS, c
> if (Opcode & DWARF_CFI_PRIMARY_OPCODE_MASK)
> Opcode &= DWARF_CFI_PRIMARY_OPCODE_MASK;
> OS.indent(2 * IndentLevel);
> - OS << CallFrameString(Opcode) << ":";
> + OS << CallFrameString(Opcode, Arch) << ":";
> for (unsigned i = 0; i < Instr.Ops.size(); ++i)
> printOperand(OS, MRI, IsEH, Instr, i, Instr.Ops[i]);
> OS << '\n';
> @@ -325,8 +325,9 @@ void FDE::dump(raw_ostream &OS, const MC
> OS << "\n";
> }
>
> -DWARFDebugFrame::DWARFDebugFrame(bool IsEH, uint64_t EHFrameAddress)
> - : IsEH(IsEH), EHFrameAddress(EHFrameAddress) {}
> +DWARFDebugFrame::DWARFDebugFrame(Triple::ArchType Arch,
> + bool IsEH, uint64_t EHFrameAddress)
> + : Arch(Arch), IsEH(IsEH), EHFrameAddress(EHFrameAddress) {}
>
> DWARFDebugFrame::~DWARFDebugFrame() = default;
>
> @@ -460,7 +461,7 @@ void DWARFDebugFrame::parse(DWARFDataExt
> StartOffset, Length, Version, AugmentationString, AddressSize,
> SegmentDescriptorSize, CodeAlignmentFactor, DataAlignmentFactor,
> ReturnAddressRegister, AugmentationData, FDEPointerEncoding,
> - LSDAPointerEncoding, Personality, PersonalityEncoding);
> + LSDAPointerEncoding, Personality, PersonalityEncoding, Arch);
> CIEs[StartOffset] = Cie.get();
> Entries.emplace_back(std::move(Cie));
> } else {
> @@ -512,7 +513,7 @@ void DWARFDebugFrame::parse(DWARFDataExt
>
> Entries.emplace_back(new FDE(StartOffset, Length, CIEPointer,
> InitialLocation, AddressRange,
> - Cie, LSDAAddress));
> + Cie, LSDAAddress, Arch));
> }
>
> if (Error E =
>
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Wed Sep 26 03:14:15 2018
> @@ -285,6 +285,7 @@ public:
> void EmitCFIUndefined(int64_t Register) override;
> void EmitCFIRegister(int64_t Register1, int64_t Register2) override;
> void EmitCFIWindowSave() override;
> + void EmitCFINegateRAState() override;
> void EmitCFIReturnColumn(int64_t Register) override;
>
> void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) override;
> @@ -1564,6 +1565,12 @@ void MCAsmStreamer::EmitCFIWindowSave()
> EmitEOL();
> }
>
> +void MCAsmStreamer::EmitCFINegateRAState() {
> + MCStreamer::EmitCFINegateRAState();
> + OS << "\t.cfi_negate_ra_state";
> + EmitEOL();
> +}
> +
> void MCAsmStreamer::EmitCFIReturnColumn(int64_t Register) {
> MCStreamer::EmitCFIReturnColumn(Register);
> OS << "\t.cfi_return_column " << Register;
>
> Modified: llvm/trunk/lib/MC/MCDwarf.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCDwarf.cpp (original)
> +++ llvm/trunk/lib/MC/MCDwarf.cpp Wed Sep 26 03:14:15 2018
> @@ -1332,6 +1332,10 @@ void FrameEmitterImpl::EmitCFIInstructio
> Streamer.EmitIntValue(dwarf::DW_CFA_GNU_window_save, 1);
> return;
>
> + case MCCFIInstruction::OpNegateRAState:
> + Streamer.EmitIntValue(dwarf::DW_CFA_AARCH64_negate_ra_state, 1);
> + return;
> +
> case MCCFIInstruction::OpUndefined: {
> unsigned Reg = Instr.getRegister();
> Streamer.EmitIntValue(dwarf::DW_CFA_undefined, 1);
>
> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCStreamer.cpp Wed Sep 26 03:14:15 2018
> @@ -565,6 +565,15 @@ void MCStreamer::EmitCFIWindowSave() {
> CurFrame->Instructions.push_back(Instruction);
> }
>
> +void MCStreamer::EmitCFINegateRAState() {
> + MCSymbol *Label = EmitCFILabel();
> + MCCFIInstruction Instruction = MCCFIInstruction::createNegateRAState(Label);
> + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
> + if (!CurFrame)
> + return;
> + CurFrame->Instructions.push_back(Instruction);
> +}
> +
> void MCStreamer::EmitCFIReturnColumn(int64_t Register) {
> MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
> if (!CurFrame)
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp Wed Sep 26 03:14:15 2018
> @@ -622,6 +622,12 @@ void AArch64FrameLowering::emitPrologue(
> if (ShouldSignReturnAddress(MF)) {
> BuildMI(MBB, MBBI, DL, TII->get(AArch64::PACIASP))
> .setMIFlag(MachineInstr::FrameSetup);
> +
> + unsigned CFIIndex =
> + MF.addFrameInst(MCCFIInstruction::createNegateRAState(nullptr));
> + BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
> + .addCFIIndex(CFIIndex)
> + .setMIFlags(MachineInstr::FrameSetup);
> }
>
> // All calls are tail calls in GHC calling conv, and functions have no
>
> Modified: llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp Wed Sep 26 03:14:15 2018
> @@ -175,6 +175,7 @@ private:
>
> bool parseDirectiveReq(StringRef Name, SMLoc L);
> bool parseDirectiveUnreq(SMLoc L);
> + bool parseDirectiveCFINegateRAState();
>
> bool validateInstruction(MCInst &Inst, SMLoc &IDLoc,
> SmallVectorImpl<SMLoc> &Loc);
> @@ -4892,6 +4893,8 @@ bool AArch64AsmParser::ParseDirective(As
> parseDirectiveUnreq(Loc);
> else if (IDVal == ".inst")
> parseDirectiveInst(Loc);
> + else if (IDVal == ".cfi_negate_ra_state")
> + parseDirectiveCFINegateRAState();
> else if (IsMachO) {
> if (IDVal == MCLOHDirectiveName())
> parseDirectiveLOH(IDVal, Loc);
> @@ -5285,6 +5288,13 @@ bool AArch64AsmParser::parseDirectiveUnr
> return false;
> }
>
> +bool AArch64AsmParser::parseDirectiveCFINegateRAState() {
> + if (parseToken(AsmToken::EndOfStatement, "unexpected token in directive"))
> + return true;
> + getStreamer().EmitCFINegateRAState();
> + return false;
> +}
> +
> bool
> AArch64AsmParser::classifySymbolRef(const MCExpr *Expr,
> AArch64MCExpr::VariantKind &ELFRefKind,
>
> Modified: llvm/trunk/test/CodeGen/AArch64/sign-return-address.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/sign-return-address.ll?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/sign-return-address.ll (original)
> +++ llvm/trunk/test/CodeGen/AArch64/sign-return-address.ll Wed Sep 26 03:14:15 2018
> @@ -24,17 +24,17 @@ define i32 @leaf_sign_non_leaf(i32 %x) "
> ; CHECK-LABEL: @leaf_sign_all
> ; CHECK: paciasp
> ; CHECK: autiasp
> -; CHECK-NEXT: ret
> +; CHECK: ret
> define i32 @leaf_sign_all(i32 %x) "sign-return-address"="all" {
> ret i32 %x
> }
>
> ; CHECK: @leaf_clobbers_lr
> ; CHECK: paciasp
> -; CHECK-NEXT: str x30, [sp, #-16]!
> +; CHECK: str x30, [sp, #-16]!
> ; CHECK: ldr x30, [sp], #16
> ; CHECK-NEXT: autiasp
> -; CHECK-NEXT: ret
> +; CHECK: ret
> define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf" {
> call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
> ret i64 %x
> @@ -45,7 +45,7 @@ declare i32 @foo(i32)
> ; CHECK: @non_leaf_sign_all
> ; CHECK: paciasp
> ; CHECK: autiasp
> -; CHECK-NEXT: ret
> +; CHECK: ret
> define i32 @non_leaf_sign_all(i32 %x) "sign-return-address"="all" {
> %call = call i32 @foo(i32 %x)
> ret i32 %call
> @@ -53,10 +53,10 @@ define i32 @non_leaf_sign_all(i32 %x) "s
>
> ; CHECK: @non_leaf_sign_non_leaf
> ; CHECK: paciasp
> -; CHECK-NEXT: str x30, [sp, #-16]!
> +; CHECK: str x30, [sp, #-16]!
> ; CHECK: ldr x30, [sp], #16
> -; CHECK-NEXT: autiasp
> -; CHECK-NEXT: ret
> +; CHECK: autiasp
> +; CHECK: ret
> define i32 @non_leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf" {
> %call = call i32 @foo(i32 %x)
> ret i32 %call
> @@ -65,7 +65,7 @@ define i32 @non_leaf_sign_non_leaf(i32 %
> ; CHECK-LABEL: @leaf_sign_all_v83
> ; CHECK: paciasp
> ; CHECK-NOT: ret
> -; CHECK-NEXT: retaa
> +; CHECK: retaa
> ; CHECK-NOT: ret
> define i32 @leaf_sign_all_v83(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" {
> ret i32 %x
> @@ -75,10 +75,10 @@ declare fastcc i64 @bar(i64)
>
> ; CHECK-LABEL: @spill_lr_and_tail_call
> ; CHECK: paciasp
> -; CHECK-NEXT: str x30, [sp, #-16]!
> +; CHECK: str x30, [sp, #-16]!
> ; CHECK: ldr x30, [sp], #16
> -; CHECK-NEXT: autiasp
> -; CHECK-NEXT: b bar
> +; CHECK: autiasp
> +; CHECK: b bar
> define fastcc void @spill_lr_and_tail_call(i64 %x) "sign-return-address"="all" {
> call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
> tail call fastcc i64 @bar(i64 %x)
>
> Modified: llvm/trunk/test/CodeGen/MIR/AArch64/cfi.mir
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/AArch64/cfi.mir?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/MIR/AArch64/cfi.mir (original)
> +++ llvm/trunk/test/CodeGen/MIR/AArch64/cfi.mir Wed Sep 26 03:14:15 2018
> @@ -45,4 +45,6 @@ body: |
> ; CHECK: CFI_INSTRUCTION escape 0x61, 0x62, 0x63
> CFI_INSTRUCTION window_save
> ; CHECK: CFI_INSTRUCTION window_save
> + CFI_INSTRUCTION negate_ra_sign_state
> + ; CHECK: CFI_INSTRUCTION negate_ra_sign_state
> RET_ReallyLR
>
> Modified: llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)
> +++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Wed Sep 26 03:14:15 2018
> @@ -393,7 +393,7 @@ bool collectStatsForObjectFile(ObjectFil
>
> static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx, Twine Filename,
> raw_ostream &OS) {
> - logAllUnhandledErrors(DICtx.loadRegisterInfo(Obj), errs(),
> + logAllUnhandledErrors(DICtx.loadArchitectureInfo(Obj), errs(),
> Filename.str() + ": ");
> // The UUID dump already contains all the same information.
> if (!(DumpType & DIDT_UUID) || DumpType == DIDT_All)
>
> Modified: llvm/trunk/tools/llvm-readobj/DwarfCFIEHPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/DwarfCFIEHPrinter.h?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-readobj/DwarfCFIEHPrinter.h (original)
> +++ llvm/trunk/tools/llvm-readobj/DwarfCFIEHPrinter.h Wed Sep 26 03:14:15 2018
> @@ -16,6 +16,7 @@
> #include "llvm/BinaryFormat/Dwarf.h"
> #include "llvm/Object/ELF.h"
> #include "llvm/Object/ELFTypes.h"
> +#include "llvm/Object/ELFObjectFile.h"
> #include "llvm/Support/Casting.h"
> #include "llvm/Support/ScopedPrinter.h"
> #include "llvm/Support/Debug.h"
> @@ -31,15 +32,15 @@ namespace DwarfCFIEH {
> template <typename ELFT>
> class PrinterContext {
> ScopedPrinter &W;
> - const object::ELFFile<ELFT> *Obj;
> + const object::ELFObjectFile<ELFT> *ObjF;
>
> void printEHFrameHdr(uint64_t Offset, uint64_t Address, uint64_t Size) const;
>
> void printEHFrame(const typename ELFT::Shdr *EHFrameShdr) const;
>
> public:
> - PrinterContext(ScopedPrinter &W, const object::ELFFile<ELFT> *Obj)
> - : W(W), Obj(Obj) {}
> + PrinterContext(ScopedPrinter &W, const object::ELFObjectFile<ELFT> *ObjF)
> + : W(W), ObjF(ObjF) {}
>
> void printUnwindInformation() const;
> };
> @@ -59,6 +60,7 @@ static const typename ELFO::Elf_Shdr *fi
>
> template <typename ELFT>
> void PrinterContext<ELFT>::printUnwindInformation() const {
> + const object::ELFFile<ELFT> *Obj = ObjF->getELFFile();
> const typename ELFT::Phdr *EHFramePhdr = nullptr;
>
> auto PHs = Obj->program_headers();
> @@ -101,6 +103,7 @@ void PrinterContext<ELFT>::printEHFrameH
> W.startLine() << format("Offset: 0x%" PRIx64 "\n", EHFrameHdrOffset);
> W.startLine() << format("Size: 0x%" PRIx64 "\n", EHFrameHdrSize);
>
> + const object::ELFFile<ELFT> *Obj = ObjF->getELFFile();
> const auto *EHFrameHdrShdr = findSectionByAddress(Obj, EHFrameHdrAddress);
> if (EHFrameHdrShdr) {
> auto SectionName = Obj->getSectionName(EHFrameHdrShdr);
> @@ -173,6 +176,7 @@ void PrinterContext<ELFT>::printEHFrame(
> ShOffset, Address);
> W.indent();
>
> + const object::ELFFile<ELFT> *Obj = ObjF->getELFFile();
> auto Result = Obj->getSectionContents(EHFrameShdr);
> if (Error E = Result.takeError())
> reportError(toString(std::move(E)));
> @@ -183,7 +187,8 @@ void PrinterContext<ELFT>::printEHFrame(
> Contents.size()),
> ELFT::TargetEndianness == support::endianness::little,
> ELFT::Is64Bits ? 8 : 4);
> - DWARFDebugFrame EHFrame(/*IsEH=*/true, /*EHFrameAddress=*/Address);
> + DWARFDebugFrame EHFrame(Triple::ArchType(ObjF->getArch()), /*IsEH=*/true,
> + /*EHFrameAddress=*/Address);
> EHFrame.parse(DE);
>
> for (const auto &Entry : EHFrame) {
>
> Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=343089&r1=343088&r2=343089&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
> +++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Wed Sep 26 03:14:15 2018
> @@ -139,7 +139,7 @@ struct DynRegionInfo {
> template<typename ELFT>
> class ELFDumper : public ObjDumper {
> public:
> - ELFDumper(const ELFFile<ELFT> *Obj, ScopedPrinter &Writer);
> + ELFDumper(const object::ELFObjectFile<ELFT> *ObjF, ScopedPrinter &Writer);
>
> void printFileHeaders() override;
> void printSections() override;
> @@ -181,6 +181,7 @@ private:
> TYPEDEF_ELF_TYPES(ELFT)
>
> DynRegionInfo checkDRI(DynRegionInfo DRI) {
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> if (DRI.Addr < Obj->base() ||
> (const uint8_t *)DRI.Addr + DRI.Size > Obj->base() + Obj->getBufSize())
> error(llvm::object::object_error::parse_failed);
> @@ -188,11 +189,11 @@ private:
> }
>
> DynRegionInfo createDRIFrom(const Elf_Phdr *P, uintX_t EntSize) {
> - return checkDRI({Obj->base() + P->p_offset, P->p_filesz, EntSize});
> + return checkDRI({ObjF->getELFFile()->base() + P->p_offset, P->p_filesz, EntSize});
> }
>
> DynRegionInfo createDRIFrom(const Elf_Shdr *S) {
> - return checkDRI({Obj->base() + S->sh_offset, S->sh_size, S->sh_entsize});
> + return checkDRI({ObjF->getELFFile()->base() + S->sh_offset, S->sh_size, S->sh_entsize});
> }
>
> void parseDynamicTable(ArrayRef<const Elf_Phdr *> LoadSegments);
> @@ -206,7 +207,7 @@ private:
> void LoadVersionNeeds(const Elf_Shdr *ec) const;
> void LoadVersionDefs(const Elf_Shdr *sec) const;
>
> - const ELFO *Obj;
> + const object::ELFObjectFile<ELFT> *ObjF;
> DynRegionInfo DynRelRegion;
> DynRegionInfo DynRelaRegion;
> DynRegionInfo DynRelrRegion;
> @@ -289,6 +290,7 @@ void ELFDumper<ELFT>::printSymbolsHelper
> StringRef StrTable, SymtabName;
> size_t Entries = 0;
> Elf_Sym_Range Syms(nullptr, nullptr);
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> if (IsDynamic) {
> StrTable = DynamicStringTable;
> Syms = dynamic_symbols();
> @@ -451,7 +453,7 @@ private:
> namespace llvm {
>
> template <class ELFT>
> -static std::error_code createELFDumper(const ELFFile<ELFT> *Obj,
> +static std::error_code createELFDumper(const ELFObjectFile<ELFT> *Obj,
> ScopedPrinter &Writer,
> std::unique_ptr<ObjDumper> &Result) {
> Result.reset(new ELFDumper<ELFT>(Obj, Writer));
> @@ -463,19 +465,19 @@ std::error_code createELFDumper(const ob
> std::unique_ptr<ObjDumper> &Result) {
> // Little-endian 32-bit
> if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
> - return createELFDumper(ELFObj->getELFFile(), Writer, Result);
> + return createELFDumper(ELFObj, Writer, Result);
>
> // Big-endian 32-bit
> if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
> - return createELFDumper(ELFObj->getELFFile(), Writer, Result);
> + return createELFDumper(ELFObj, Writer, Result);
>
> // Little-endian 64-bit
> if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
> - return createELFDumper(ELFObj->getELFFile(), Writer, Result);
> + return createELFDumper(ELFObj, Writer, Result);
>
> // Big-endian 64-bit
> if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
> - return createELFDumper(ELFObj->getELFFile(), Writer, Result);
> + return createELFDumper(ELFObj, Writer, Result);
>
> return readobj_error::unsupported_obj_file_format;
> }
> @@ -488,7 +490,7 @@ template <class ELFT>
> void ELFDumper<ELFT>::LoadVersionNeeds(const Elf_Shdr *sec) const {
> unsigned vn_size = sec->sh_size; // Size of section in bytes
> unsigned vn_count = sec->sh_info; // Number of Verneed entries
> - const char *sec_start = (const char *)Obj->base() + sec->sh_offset;
> + const char *sec_start = (const char *)ObjF->getELFFile()->base() + sec->sh_offset;
> const char *sec_end = sec_start + vn_size;
> // The first Verneed entry is at the start of the section.
> const char *p = sec_start;
> @@ -522,7 +524,7 @@ template <class ELFT>
> void ELFDumper<ELFT>::LoadVersionDefs(const Elf_Shdr *sec) const {
> unsigned vd_size = sec->sh_size; // Size of section in bytes
> unsigned vd_count = sec->sh_info; // Number of Verdef entries
> - const char *sec_start = (const char *)Obj->base() + sec->sh_offset;
> + const char *sec_start = (const char *)ObjF->getELFFile()->base() + sec->sh_offset;
> const char *sec_end = sec_start + vd_size;
> // The first Verdef entry is at the start of the section.
> const char *p = sec_start;
> @@ -700,13 +702,13 @@ static void printVersionDependencySectio
>
> template <typename ELFT> void ELFDumper<ELFT>::printVersionInfo() {
> // Dump version symbol section.
> - printVersionSymbolSection(this, Obj, dot_gnu_version_sec, W);
> + printVersionSymbolSection(this, ObjF->getELFFile(), dot_gnu_version_sec, W);
>
> // Dump version definition section.
> - printVersionDefinitionSection(this, Obj, dot_gnu_version_d_sec, W);
> + printVersionDefinitionSection(this, ObjF->getELFFile(), dot_gnu_version_d_sec, W);
>
> // Dump version dependency section.
> - printVersionDependencySection(this, Obj, dot_gnu_version_r_sec, W);
> + printVersionDependencySection(this, ObjF->getELFFile(), dot_gnu_version_r_sec, W);
> }
>
> template <typename ELFT>
> @@ -727,7 +729,7 @@ StringRef ELFDumper<ELFT>::getSymbolVers
>
> // Get the corresponding version index entry
> const Elf_Versym *vs = unwrapOrError(
> - Obj->template getEntry<Elf_Versym>(dot_gnu_version_sec, entry_index));
> + ObjF->getELFFile()->template getEntry<Elf_Versym>(dot_gnu_version_sec, entry_index));
> size_t version_index = vs->vs_index & ELF::VERSYM_VERSION;
>
> // Special markers for unversioned symbols.
> @@ -760,6 +762,7 @@ StringRef ELFDumper<ELFT>::getSymbolVers
>
> template <typename ELFT>
> StringRef ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const {
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec));
> Elf_Sym_Range Syms = unwrapOrError(Obj->symbols(DotSymtabSec));
> if (Index >= Syms.size())
> @@ -807,6 +810,7 @@ void ELFDumper<ELFT>::getSectionNameInde
> if (SectionIndex == SHN_XINDEX)
> SectionIndex = unwrapOrError(object::getExtendedSymbolTableIndex<ELFT>(
> Symbol, FirstSym, ShndxTable));
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> const typename ELFT::Shdr *Sec =
> unwrapOrError(Obj->getSection(SectionIndex));
> SectionName = unwrapOrError(Obj->getSectionName(Sec));
> @@ -1375,9 +1379,11 @@ static const char *getElfMipsOptionsOdkT
> }
>
> template <typename ELFT>
> -ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, ScopedPrinter &Writer)
> - : ObjDumper(Writer), Obj(Obj) {
> +ELFDumper<ELFT>::ELFDumper(const object::ELFObjectFile<ELFT> *ObjF,
> + ScopedPrinter &Writer)
> + : ObjDumper(Writer), ObjF(ObjF) {
> SmallVector<const Elf_Phdr *, 4> LoadSegments;
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) {
> if (Phdr.p_type == ELF::PT_DYNAMIC) {
> DynamicTable = createDRIFrom(&Phdr, sizeof(Elf_Dyn));
> @@ -1458,7 +1464,7 @@ void ELFDumper<ELFT>::parseDynamicTable(
> uint64_t Delta = VAddr - Phdr.p_vaddr;
> if (Delta >= Phdr.p_filesz)
> report_fatal_error("Virtual address is not in any segment");
> - return Obj->base() + Phdr.p_offset + Delta;
> + return ObjF->getELFFile()->base() + Phdr.p_offset + Delta;
> };
>
> uint64_t SONameOffset = 0;
> @@ -1557,51 +1563,51 @@ typename ELFDumper<ELFT>::Elf_Relr_Range
>
> template<class ELFT>
> void ELFDumper<ELFT>::printFileHeaders() {
> - ELFDumperStyle->printFileHeaders(Obj);
> + ELFDumperStyle->printFileHeaders(ObjF->getELFFile());
> }
>
> template<class ELFT>
> void ELFDumper<ELFT>::printSections() {
> - ELFDumperStyle->printSections(Obj);
> + ELFDumperStyle->printSections(ObjF->getELFFile());
> }
>
> template<class ELFT>
> void ELFDumper<ELFT>::printRelocations() {
> - ELFDumperStyle->printRelocations(Obj);
> + ELFDumperStyle->printRelocations(ObjF->getELFFile());
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printProgramHeaders() {
> - ELFDumperStyle->printProgramHeaders(Obj);
> + ELFDumperStyle->printProgramHeaders(ObjF->getELFFile());
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printDynamicRelocations() {
> - ELFDumperStyle->printDynamicRelocations(Obj);
> + ELFDumperStyle->printDynamicRelocations(ObjF->getELFFile());
> }
>
> template<class ELFT>
> void ELFDumper<ELFT>::printSymbols() {
> - ELFDumperStyle->printSymbols(Obj);
> + ELFDumperStyle->printSymbols(ObjF->getELFFile());
> }
>
> template<class ELFT>
> void ELFDumper<ELFT>::printDynamicSymbols() {
> - ELFDumperStyle->printDynamicSymbols(Obj);
> + ELFDumperStyle->printDynamicSymbols(ObjF->getELFFile());
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printHashHistogram() {
> - ELFDumperStyle->printHashHistogram(Obj);
> + ELFDumperStyle->printHashHistogram(ObjF->getELFFile());
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printCGProfile() {
> - ELFDumperStyle->printCGProfile(Obj);
> + ELFDumperStyle->printCGProfile(ObjF->getELFFile());
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printNotes() {
> - ELFDumperStyle->printNotes(Obj);
> + ELFDumperStyle->printNotes(ObjF->getELFFile());
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printELFLinkerOptions() {
> - ELFDumperStyle->printELFLinkerOptions(Obj);
> + ELFDumperStyle->printELFLinkerOptions(ObjF->getELFFile());
> }
>
> static const char *getTypeString(unsigned Arch, uint64_t Type) {
> @@ -1842,9 +1848,9 @@ void ELFDumper<ELFT>::printValue(uint64_
>
> template<class ELFT>
> void ELFDumper<ELFT>::printUnwindInfo() {
> - const unsigned Machine = Obj->getHeader()->e_machine;
> + const unsigned Machine = ObjF->getELFFile()->getHeader()->e_machine;
> if (Machine == EM_386 || Machine == EM_X86_64) {
> - DwarfCFIEH::PrinterContext<ELFT> Ctx(W, Obj);
> + DwarfCFIEH::PrinterContext<ELFT> Ctx(W, ObjF);
> return Ctx.printUnwindInformation();
> }
> W.startLine() << "UnwindInfo not implemented.\n";
> @@ -1853,6 +1859,7 @@ void ELFDumper<ELFT>::printUnwindInfo()
> namespace {
>
> template <> void ELFDumper<ELF32LE>::printUnwindInfo() {
> + const ELFFile<ELF32LE> *Obj = ObjF->getELFFile();
> const unsigned Machine = Obj->getHeader()->e_machine;
> if (Machine == EM_ARM) {
> ARM::EHABI::PrinterContext<ELF32LE> Ctx(W, Obj, DotSymtabSec);
> @@ -1895,7 +1902,7 @@ void ELFDumper<ELFT>::printDynamicTable(
> uintX_t Tag = Entry.getTag();
> ++I;
> W.startLine() << " " << format_hex(Tag, Is64 ? 18 : 10, opts::Output != opts::GNU) << " "
> - << format("%-21s", getTypeString(Obj->getHeader()->e_machine, Tag));
> + << format("%-21s", getTypeString(ObjF->getELFFile()->getHeader()->e_machine, Tag));
> printValue(Tag, Entry.getVal());
> OS << "\n";
> }
> @@ -1962,6 +1969,7 @@ void ELFDumper<ELFT>::printAttributes()
> namespace {
>
> template <> void ELFDumper<ELF32LE>::printAttributes() {
> + const ELFFile<ELF32LE> *Obj = ObjF->getELFFile();
> if (Obj->getHeader()->e_machine != EM_ARM) {
> W.startLine() << "Attributes not implemented.\n";
> return;
> @@ -2247,6 +2255,7 @@ MipsGOTParser<ELFT>::getPltSym(const Ent
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printMipsPLTGOT() {
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> if (Obj->getHeader()->e_machine != EM_MIPS)
> reportError("MIPS PLT GOT is available for MIPS targets only");
>
> @@ -2331,6 +2340,7 @@ static int getMipsRegisterSize(uint8_t F
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printMipsABIFlags() {
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.abiflags");
> if (!Shdr) {
> W.startLine() << "There is no .MIPS.abiflags section in the file.\n";
> @@ -2376,6 +2386,7 @@ static void printMipsReginfoData(ScopedP
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printMipsReginfo() {
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> const Elf_Shdr *Shdr = findSectionByName(*Obj, ".reginfo");
> if (!Shdr) {
> W.startLine() << "There is no .reginfo section in the file.\n";
> @@ -2393,6 +2404,7 @@ template <class ELFT> void ELFDumper<ELF
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printMipsOptions() {
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.options");
> if (!Shdr) {
> W.startLine() << "There is no .MIPS.options section in the file.\n";
> @@ -2422,6 +2434,7 @@ template <class ELFT> void ELFDumper<ELF
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printStackMap() const {
> + const ELFFile<ELFT> *Obj = ObjF->getELFFile();
> const Elf_Shdr *StackMapSection = nullptr;
> for (const auto &Sec : unwrapOrError(Obj->sections())) {
> StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
> @@ -2442,11 +2455,11 @@ template <class ELFT> void ELFDumper<ELF
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printGroupSections() {
> - ELFDumperStyle->printGroupSections(Obj);
> + ELFDumperStyle->printGroupSections(ObjF->getELFFile());
> }
>
> template <class ELFT> void ELFDumper<ELFT>::printAddrsig() {
> - ELFDumperStyle->printAddrsig(Obj);
> + ELFDumperStyle->printAddrsig(ObjF->getELFFile());
> }
>
> static inline void printFields(formatted_raw_ostream &OS, StringRef Str1,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list