[llvm] r354972 - [DebugInfo] add SectionedAddress to DebugInfo interfaces.
Kadir Çetinkaya via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 27 08:07:42 PST 2019
Integrating an addition would be better to isolate the patch
On Wed, Feb 27, 2019 at 5:06 PM Alexey Lapshin <a.v.lapshin at mail.ru> wrote:
> Sure, I will.
>
> Do you know how it would be better to do ? I mean should I revert and
> resubmit patch or just integrate an addition ?
>
> Thank you, Alexey.
>
>
> Среда, 27 февраля 2019, 18:05 +03:00 от Kadir Çetinkaya <
> kadircet at google.com>:
>
> Hey, this patch is breaking the compiler-rt builds, could you also update
> the call sites in file:
> https://github.com/llvm-project/compiler-rt/blob/master/lib/sanitizer_common/symbolizer/sanitizer_symbolize.cc#L55
>
> On Wed, Feb 27, 2019 at 2:16 PM Alexey Lapshin via llvm-commits <
> llvm-commits at lists.llvm.org
> <http://e.mail.ru/compose/?mailto=mailto%3allvm%2dcommits@lists.llvm.org>>
> wrote:
>
> Author: avl
> Date: Wed Feb 27 05:17:36 2019
> New Revision: 354972
>
> URL: http://llvm.org/viewvc/llvm-project?rev=354972&view=rev
> Log:
> [DebugInfo] add SectionedAddress to DebugInfo interfaces.
>
> That patch is the fix for
> https://bugs.llvm.org/show_bug.cgi?id=40703
> "wrong line number info for obj file compiled with -ffunction-sections"
> bug. The problem happened with only .o files. If object file contains
> several .text sections then line number information showed incorrectly.
> The reason for this is that DwarfLineTable could not detect section
> which
> corresponds to specified address(because address is the local to the
> section). And as the result it could not select proper sequence in the
> line table. The fix is to pass SectionIndex with the address. So that it
> would be possible to differentiate addresses from various sections. With
> this fix llvm-objdump shows correct line numbers for disassembled code.
>
> Differential review: https://reviews.llvm.org/D58194
>
> Added:
> llvm/trunk/test/tools/llvm-objdump/X86/function-sections-line-numbers.s
> Modified:
> llvm/trunk/include/llvm/DebugInfo/DIContext.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFListTable.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
> llvm/trunk/include/llvm/DebugInfo/PDB/PDBContext.h
> llvm/trunk/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h
> llvm/trunk/include/llvm/DebugInfo/Symbolize/Symbolize.h
> llvm/trunk/include/llvm/Object/ObjectFile.h
> llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
> llvm/trunk/lib/DebugInfo/PDB/PDBContext.cpp
> llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
> llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h
> llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp
> llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> llvm/trunk/tools/dsymutil/DwarfStreamer.cpp
> llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.cpp
> llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.h
> llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.cpp
> llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.h
> llvm/trunk/tools/llvm-cfi-verify/llvm-cfi-verify.cpp
> llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> llvm/trunk/tools/llvm-objdump/MachODump.cpp
> llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
> llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp
> llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp
> llvm/trunk/tools/llvm-xray/func-id-helper.cpp
> llvm/trunk/tools/sancov/sancov.cpp
> llvm/trunk/tools/sanstats/sanstats.cpp
> llvm/trunk/unittests/tools/llvm-cfi-verify/FileAnalysis.cpp
> llvm/trunk/unittests/tools/llvm-cfi-verify/GraphBuilder.cpp
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DIContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DIContext.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DIContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DIContext.h Wed Feb 27 05:17:36 2019
> @@ -203,11 +203,14 @@ public:
> return true;
> }
>
> - virtual DILineInfo getLineInfoForAddress(uint64_t Address,
> + virtual DILineInfo getLineInfoForAddress(
> + object::SectionedAddress Address,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
> - virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address,
> - uint64_t Size, DILineInfoSpecifier Specifier =
> DILineInfoSpecifier()) = 0;
> - virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address,
> + virtual DILineInfoTable getLineInfoForAddressRange(
> + object::SectionedAddress Address, uint64_t Size,
> + DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
> + virtual DIInliningInfo getInliningInfoForAddress(
> + object::SectionedAddress Address,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
>
> private:
>
> 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=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h Wed Feb 27
> 05:17:36 2019
> @@ -317,13 +317,18 @@ public:
>
> /// Get the compilation unit, the function DIE and lexical block DIE
> for the
> /// given address where applicable.
> + /// TODO: change input parameter from "uint64_t Address"
> + /// into "SectionedAddress Address"
> DIEsForAddress getDIEsForAddress(uint64_t Address);
>
> - DILineInfo getLineInfoForAddress(uint64_t Address,
> + DILineInfo getLineInfoForAddress(
> + object::SectionedAddress Address,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
> - DILineInfoTable getLineInfoForAddressRange(uint64_t Address, uint64_t
> Size,
> + DILineInfoTable getLineInfoForAddressRange(
> + object::SectionedAddress Address, uint64_t Size,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
> - DIInliningInfo getInliningInfoForAddress(uint64_t Address,
> + DIInliningInfo getInliningInfoForAddress(
> + object::SectionedAddress Address,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
>
> bool isLittleEndian() const { return DObj->isLittleEndian(); }
> @@ -366,6 +371,8 @@ public:
> private:
> /// Return the compile unit which contains instruction with provided
> /// address.
> + /// TODO: change input parameter from "uint64_t Address"
> + /// into "SectionedAddress Address"
> DWARFCompileUnit *getCompileUnitForAddress(uint64_t Address);
> };
>
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h Wed Feb 27
> 05:17:36 2019
> @@ -139,12 +139,16 @@ public:
> static void dumpTableHeader(raw_ostream &OS);
>
> static bool orderByAddress(const Row &LHS, const Row &RHS) {
> - return LHS.Address < RHS.Address;
> + return std::tie(LHS.Address.SectionIndex, LHS.Address.Address) <
> + std::tie(RHS.Address.SectionIndex, RHS.Address.Address);
> }
>
> /// The program-counter value corresponding to a machine instruction
> - /// generated by the compiler.
> - uint64_t Address;
> + /// generated by the compiler and section index pointing to the
> section
> + /// containg this PC. If relocation information is present then
> section
> + /// index is the index of the section which contains above address.
> + /// Otherwise this is object::SectionedAddress::Undef value.
> + object::SectionedAddress Address;
> /// An unsigned integer indicating a source line number. Lines are
> numbered
> /// beginning at 1. The compiler may emit the value 0 in cases where
> an
> /// instruction cannot be attributed to any source line.
> @@ -192,6 +196,10 @@ public:
> /// and is described by line table rows [FirstRowIndex, LastRowIndex).
> uint64_t LowPC;
> uint64_t HighPC;
> + /// If relocation information is present then this is the index of the
> + /// section which contains above addresses. Otherwise this is
> + /// object::SectionedAddress::Undef value.
> + uint64_t SectionIndex;
> unsigned FirstRowIndex;
> unsigned LastRowIndex;
> bool Empty;
> @@ -199,14 +207,18 @@ public:
> void reset();
>
> static bool orderByLowPC(const Sequence &LHS, const Sequence &RHS) {
> - return LHS.LowPC < RHS.LowPC;
> + return std::tie(LHS.SectionIndex, LHS.LowPC) <
> + std::tie(RHS.SectionIndex, RHS.LowPC);
> }
>
> bool isValid() const {
> return !Empty && (LowPC < HighPC) && (FirstRowIndex < LastRowIndex);
> }
>
> - bool containsPC(uint64_t PC) const { return (LowPC <= PC && PC <
> HighPC); }
> + bool containsPC(object::SectionedAddress PC) const {
> + return SectionIndex == PC.SectionIndex &&
> + (LowPC <= PC.Address && PC.Address < HighPC);
> + }
> };
>
> struct LineTable {
> @@ -223,9 +235,9 @@ public:
>
> /// Returns the index of the row with file/line info for a given
> address,
> /// or UnknownRowIndex if there is no such row.
> - uint32_t lookupAddress(uint64_t Address) const;
> + uint32_t lookupAddress(object::SectionedAddress Address) const;
>
> - bool lookupAddressRange(uint64_t Address, uint64_t Size,
> + bool lookupAddressRange(object::SectionedAddress Address, uint64_t
> Size,
> std::vector<uint32_t> &Result) const;
>
> bool hasFileAtIndex(uint64_t FileIndex) const;
> @@ -238,7 +250,8 @@ public:
>
> /// Fills the Result argument with the file and line information
> /// corresponding to Address. Returns true on success.
> - bool getFileLineInfoForAddress(uint64_t Address, const char *CompDir,
> + bool getFileLineInfoForAddress(object::SectionedAddress Address,
> + const char *CompDir,
> DILineInfoSpecifier::FileLineInfoKind
> Kind,
> DILineInfo &Result) const;
>
> @@ -263,10 +276,15 @@ public:
>
> private:
> uint32_t findRowInSeq(const DWARFDebugLine::Sequence &Seq,
> - uint64_t Address) const;
> + object::SectionedAddress Address) const;
> Optional<StringRef>
> getSourceByIndex(uint64_t FileIndex,
> DILineInfoSpecifier::FileLineInfoKind Kind) const;
> +
> + uint32_t lookupAddressImpl(object::SectionedAddress Address) const;
> +
> + bool lookupAddressRangeImpl(object::SectionedAddress Address,
> uint64_t Size,
> + std::vector<uint32_t> &Result) const;
> };
>
> const LineTable *getLineTable(uint32_t Offset) const;
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h
> (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h Wed Feb
> 27 05:17:36 2019
> @@ -76,7 +76,7 @@ public:
> /// list. Has to be passed base address of the compile unit referencing
> this
> /// range list.
> DWARFAddressRangesVector
> - getAbsoluteRanges(llvm::Optional<SectionedAddress> BaseAddr) const;
> + getAbsoluteRanges(llvm::Optional<object::SectionedAddress> BaseAddr)
> const;
> };
>
> } // end namespace llvm
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h Wed Feb
> 27 05:17:36 2019
> @@ -37,7 +37,7 @@ struct RangeListEntry : public DWARFList
> Error extract(DWARFDataExtractor Data, uint32_t End, uint32_t
> *OffsetPtr);
> void dump(raw_ostream &OS, uint8_t AddrSize, uint8_t
> MaxEncodingStringLength,
> uint64_t &CurrentBase, DIDumpOptions DumpOpts,
> - llvm::function_ref<Optional<SectionedAddress>(uint32_t)>
> +
> llvm::function_ref<Optional<object::SectionedAddress>(uint32_t)>
> LookupPooledAddress) const;
> bool isSentinel() const { return EntryKind ==
> dwarf::DW_RLE_end_of_list; }
> };
> @@ -47,7 +47,7 @@ class DWARFDebugRnglist : public DWARFLi
> public:
> /// Build a DWARFAddressRangesVector from a rangelist.
> DWARFAddressRangesVector
> - getAbsoluteRanges(llvm::Optional<SectionedAddress> BaseAddr,
> + getAbsoluteRanges(llvm::Optional<object::SectionedAddress> BaseAddr,
> DWARFUnit &U) const;
> };
>
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h Wed Feb 27
> 05:17:36 2019
> @@ -79,7 +79,7 @@ public:
> const DWARFUnit *getUnit() const { return U; }
> void dump(raw_ostream &OS, DIDumpOptions DumpOpts = DIDumpOptions())
> const;
> void dumpSectionedAddress(raw_ostream &OS, DIDumpOptions DumpOpts,
> - SectionedAddress SA) const;
> + object::SectionedAddress SA) const;
> static void dumpAddressSection(const DWARFObject &Obj, raw_ostream &OS,
> DIDumpOptions DumpOpts, uint64_t
> SectionIndex);
>
> @@ -108,7 +108,7 @@ public:
> Optional<int64_t> getAsSignedConstant() const;
> Optional<const char *> getAsCString() const;
> Optional<uint64_t> getAsAddress() const;
> - Optional<SectionedAddress> getAsSectionedAddress() const;
> + Optional<object::SectionedAddress> getAsSectionedAddress() const;
> Optional<uint64_t> getAsSectionOffset() const;
> Optional<ArrayRef<uint8_t>> getAsBlock() const;
> Optional<uint64_t> getAsCStringOffset() const;
> @@ -246,7 +246,7 @@ inline Optional<uint64_t> toAddress(cons
> return None;
> }
>
> -inline Optional<SectionedAddress>
> +inline Optional<object::SectionedAddress>
> toSectionedAddress(const Optional<DWARFFormValue> &V) {
> if (V)
> return V->getAsSectionedAddress();
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFListTable.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFListTable.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFListTable.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFListTable.h Wed Feb 27
> 05:17:36 2019
> @@ -157,7 +157,7 @@ public:
> uint8_t getAddrSize() const { return Header.getAddrSize(); }
>
> void dump(raw_ostream &OS,
> - llvm::function_ref<Optional<SectionedAddress>(uint32_t)>
> +
> llvm::function_ref<Optional<object::SectionedAddress>(uint32_t)>
> LookupPooledAddress,
> DIDumpOptions DumpOpts = {}) const;
>
> @@ -234,7 +234,7 @@ Error DWARFListType<ListEntryType>::extr
> template <typename DWARFListType>
> void DWARFListTableBase<DWARFListType>::dump(
> raw_ostream &OS,
> - llvm::function_ref<Optional<SectionedAddress>(uint32_t)>
> + llvm::function_ref<Optional<object::SectionedAddress>(uint32_t)>
> LookupPooledAddress,
> DIDumpOptions DumpOpts) const {
> Header.dump(OS, DumpOpts);
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h Wed Feb 27
> 05:17:36 2019
> @@ -22,11 +22,6 @@ struct SectionName {
> bool IsNameUnique;
> };
>
> -struct SectionedAddress {
> - uint64_t Address;
> - uint64_t SectionIndex;
> -};
> -
> } // end namespace llvm
>
> #endif // LLVM_DEBUGINFO_DWARF_DWARFSECTION_H
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h Wed Feb 27
> 05:17:36 2019
> @@ -217,7 +217,7 @@ class DWARFUnit {
> Optional<DWARFDebugRnglistTable> RngListTable;
>
> mutable const DWARFAbbreviationDeclarationSet *Abbrevs;
> - llvm::Optional<SectionedAddress> BaseAddr;
> + llvm::Optional<object::SectionedAddress> BaseAddr;
> /// The compile unit debug information entry items.
> std::vector<DWARFDebugInfoEntry> DieArray;
>
> @@ -304,7 +304,8 @@ public:
> RangeSectionBase = Base;
> }
>
> - Optional<SectionedAddress> getAddrOffsetSectionItem(uint32_t Index)
> const;
> + Optional<object::SectionedAddress>
> + getAddrOffsetSectionItem(uint32_t Index) const;
> Optional<uint64_t> getStringOffsetSectionItem(uint32_t Index) const;
>
> DWARFDataExtractor getDebugInfoExtractor() const;
> @@ -375,7 +376,7 @@ public:
> llvm_unreachable("Invalid UnitType.");
> }
>
> - llvm::Optional<SectionedAddress> getBaseAddress();
> + llvm::Optional<object::SectionedAddress> getBaseAddress();
>
> DWARFDie getUnitDIE(bool ExtractUnitDIEOnly = true) {
> extractDIEsIfNeeded(ExtractUnitDIEOnly);
>
> Modified: llvm/trunk/include/llvm/DebugInfo/PDB/PDBContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/PDBContext.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/PDB/PDBContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/PDB/PDBContext.h Wed Feb 27 05:17:36
> 2019
> @@ -43,13 +43,13 @@ namespace pdb {
> void dump(raw_ostream &OS, DIDumpOptions DIDumpOpts) override;
>
> DILineInfo getLineInfoForAddress(
> - uint64_t Address,
> + object::SectionedAddress Address,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
> DILineInfoTable getLineInfoForAddressRange(
> - uint64_t Address, uint64_t Size,
> + object::SectionedAddress Address, uint64_t Size,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
> DIInliningInfo getInliningInfoForAddress(
> - uint64_t Address,
> + object::SectionedAddress Address,
> DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
>
> private:
>
> Modified: llvm/trunk/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h
> (original)
> +++ llvm/trunk/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h Wed
> Feb 27 05:17:36 2019
> @@ -24,13 +24,14 @@ class SymbolizableModule {
> public:
> virtual ~SymbolizableModule() = default;
>
> - virtual DILineInfo symbolizeCode(uint64_t ModuleOffset,
> + virtual DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset,
> FunctionNameKind FNKind,
> bool UseSymbolTable) const = 0;
> - virtual DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset,
> - FunctionNameKind FNKind,
> - bool UseSymbolTable) const
> = 0;
> - virtual DIGlobal symbolizeData(uint64_t ModuleOffset) const = 0;
> + virtual DIInliningInfo
> + symbolizeInlinedCode(object::SectionedAddress ModuleOffset,
> + FunctionNameKind FNKind, bool UseSymbolTable)
> const = 0;
> + virtual DIGlobal
> + symbolizeData(object::SectionedAddress ModuleOffset) const = 0;
>
> // Return true if this is a 32-bit x86 PE COFF module.
> virtual bool isWin32Module() const = 0;
>
> Modified: llvm/trunk/include/llvm/DebugInfo/Symbolize/Symbolize.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Symbolize/Symbolize.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/Symbolize/Symbolize.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/Symbolize/Symbolize.h Wed Feb 27
> 05:17:36 2019
> @@ -60,13 +60,14 @@ public:
> }
>
> Expected<DILineInfo> symbolizeCode(const std::string &ModuleName,
> - uint64_t ModuleOffset,
> + object::SectionedAddress
> ModuleOffset,
> StringRef DWPName = "");
> - Expected<DIInliningInfo> symbolizeInlinedCode(const std::string
> &ModuleName,
> - uint64_t ModuleOffset,
> - StringRef DWPName = "");
> + Expected<DIInliningInfo>
> + symbolizeInlinedCode(const std::string &ModuleName,
> + object::SectionedAddress ModuleOffset,
> + StringRef DWPName = "");
> Expected<DIGlobal> symbolizeData(const std::string &ModuleName,
> - uint64_t ModuleOffset);
> + object::SectionedAddress ModuleOffset);
> void flush();
>
> static std::string
>
> Modified: llvm/trunk/include/llvm/Object/ObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/ObjectFile.h Wed Feb 27 05:17:36 2019
> @@ -135,6 +135,30 @@ public:
> const ObjectFile *getObject() const;
> };
>
> +struct SectionedAddress {
> + // TODO: constructors could be removed when C++14 would be adopted.
> + SectionedAddress() {}
> + SectionedAddress(uint64_t Addr, uint64_t SectIdx)
> + : Address(Addr), SectionIndex(SectIdx) {}
> +
> + const static uint64_t UndefSection = UINT64_MAX;
> +
> + uint64_t Address = 0;
> + uint64_t SectionIndex = UndefSection;
> +};
> +
> +inline bool operator<(const SectionedAddress &LHS,
> + const SectionedAddress &RHS) {
> + return std::tie(LHS.SectionIndex, LHS.Address) <
> + std::tie(RHS.SectionIndex, RHS.Address);
> +}
> +
> +inline bool operator==(const SectionedAddress &LHS,
> + const SectionedAddress &RHS) {
> + return std::tie(LHS.SectionIndex, LHS.Address) ==
> + std::tie(RHS.SectionIndex, RHS.Address);
> +}
> +
> /// This is a value type class that represents a single symbol in the
> list of
> /// symbols in the object file.
> class SymbolRef : public BasicSymbolRef {
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp Wed Feb 27 05:17:36
> 2019
> @@ -268,11 +268,11 @@ static void dumpAddrSection(raw_ostream
> }
>
> // Dump the .debug_rnglists or .debug_rnglists.dwo section (DWARF v5).
> -static void
> -dumpRnglistsSection(raw_ostream &OS, DWARFDataExtractor &rnglistData,
> -
> llvm::function_ref<Optional<SectionedAddress>(uint32_t)>
> - LookupPooledAddress,
> - DIDumpOptions DumpOpts) {
> +static void dumpRnglistsSection(
> + raw_ostream &OS, DWARFDataExtractor &rnglistData,
> + llvm::function_ref<Optional<object::SectionedAddress>(uint32_t)>
> + LookupPooledAddress,
> + DIDumpOptions DumpOpts) {
> uint32_t Offset = 0;
> while (rnglistData.isValidOffset(Offset)) {
> llvm::DWARFDebugRnglistTable Rnglists;
> @@ -938,6 +938,8 @@ DWARFContext::DIEsForAddress DWARFContex
> return Result;
> }
>
> +/// TODO: change input parameter from "uint64_t Address"
> +/// into "SectionedAddress Address"
> static bool getFunctionNameAndStartLineForAddress(DWARFCompileUnit *CU,
> uint64_t Address,
> FunctionNameKind Kind,
> @@ -966,36 +968,37 @@ static bool getFunctionNameAndStartLineF
> return FoundResult;
> }
>
> -DILineInfo DWARFContext::getLineInfoForAddress(uint64_t Address,
> +DILineInfo DWARFContext::getLineInfoForAddress(object::SectionedAddress
> Address,
> DILineInfoSpecifier Spec) {
> DILineInfo Result;
>
> - DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
> + DWARFCompileUnit *CU = getCompileUnitForAddress(Address.Address);
> if (!CU)
> return Result;
> - getFunctionNameAndStartLineForAddress(CU, Address, Spec.FNKind,
> - Result.FunctionName,
> - Result.StartLine);
> +
> + getFunctionNameAndStartLineForAddress(CU, Address.Address, Spec.FNKind,
> + Result.FunctionName,
> Result.StartLine);
> if (Spec.FLIKind != FileLineInfoKind::None) {
> - if (const DWARFLineTable *LineTable = getLineTableForUnit(CU))
> - LineTable->getFileLineInfoForAddress(Address,
> CU->getCompilationDir(),
> - Spec.FLIKind, Result);
> + if (const DWARFLineTable *LineTable = getLineTableForUnit(CU)) {
> + LineTable->getFileLineInfoForAddress(
> + {Address.Address, Address.SectionIndex},
> CU->getCompilationDir(),
> + Spec.FLIKind, Result);
> + }
> }
> return Result;
> }
>
> -DILineInfoTable
> -DWARFContext::getLineInfoForAddressRange(uint64_t Address, uint64_t Size,
> - DILineInfoSpecifier Spec) {
> +DILineInfoTable DWARFContext::getLineInfoForAddressRange(
> + object::SectionedAddress Address, uint64_t Size, DILineInfoSpecifier
> Spec) {
> DILineInfoTable Lines;
> - DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
> + DWARFCompileUnit *CU = getCompileUnitForAddress(Address.Address);
> if (!CU)
> return Lines;
>
> std::string FunctionName = "<invalid>";
> uint32_t StartLine = 0;
> - getFunctionNameAndStartLineForAddress(CU, Address, Spec.FNKind,
> FunctionName,
> - StartLine);
> + getFunctionNameAndStartLineForAddress(CU, Address.Address, Spec.FNKind,
> + FunctionName, StartLine);
>
> // If the Specifier says we don't need FileLineInfo, just
> // return the top-most function at the starting address.
> @@ -1003,7 +1006,7 @@ DWARFContext::getLineInfoForAddressRange
> DILineInfo Result;
> Result.FunctionName = FunctionName;
> Result.StartLine = StartLine;
> - Lines.push_back(std::make_pair(Address, Result));
> + Lines.push_back(std::make_pair(Address.Address, Result));
> return Lines;
> }
>
> @@ -1011,8 +1014,10 @@ DWARFContext::getLineInfoForAddressRange
>
> // Get the index of row we're looking for in the line table.
> std::vector<uint32_t> RowVector;
> - if (!LineTable->lookupAddressRange(Address, Size, RowVector))
> + if (!LineTable->lookupAddressRange({Address.Address,
> Address.SectionIndex},
> + Size, RowVector)) {
> return Lines;
> + }
>
> for (uint32_t RowIndex : RowVector) {
> // Take file number and line/column from the row.
> @@ -1024,33 +1029,33 @@ DWARFContext::getLineInfoForAddressRange
> Result.Line = Row.Line;
> Result.Column = Row.Column;
> Result.StartLine = StartLine;
> - Lines.push_back(std::make_pair(Row.Address, Result));
> + Lines.push_back(std::make_pair(Row.Address.Address, Result));
> }
>
> return Lines;
> }
>
> DIInliningInfo
> -DWARFContext::getInliningInfoForAddress(uint64_t Address,
> +DWARFContext::getInliningInfoForAddress(object::SectionedAddress Address,
> DILineInfoSpecifier Spec) {
> DIInliningInfo InliningInfo;
>
> - DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
> + DWARFCompileUnit *CU = getCompileUnitForAddress(Address.Address);
> if (!CU)
> return InliningInfo;
>
> const DWARFLineTable *LineTable = nullptr;
> SmallVector<DWARFDie, 4> InlinedChain;
> - CU->getInlinedChainForAddress(Address, InlinedChain);
> + CU->getInlinedChainForAddress(Address.Address, InlinedChain);
> if (InlinedChain.size() == 0) {
> // If there is no DIE for address (e.g. it is in unavailable .dwo
> file),
> // try to at least get file/line info from symbol table.
> if (Spec.FLIKind != FileLineInfoKind::None) {
> DILineInfo Frame;
> LineTable = getLineTableForUnit(CU);
> - if (LineTable &&
> - LineTable->getFileLineInfoForAddress(Address,
> CU->getCompilationDir(),
> - Spec.FLIKind, Frame))
> + if (LineTable && LineTable->getFileLineInfoForAddress(
> + {Address.Address, Address.SectionIndex},
> + CU->getCompilationDir(), Spec.FLIKind, Frame))
> InliningInfo.addFrame(Frame);
> }
> return InliningInfo;
> @@ -1072,8 +1077,9 @@ DWARFContext::getInliningInfoForAddress(
> LineTable = getLineTableForUnit(CU);
> // For the topmost routine, get file/line info from line table.
> if (LineTable)
> - LineTable->getFileLineInfoForAddress(Address,
> CU->getCompilationDir(),
> - Spec.FLIKind, Frame);
> + LineTable->getFileLineInfoForAddress(
> + {Address.Address, Address.SectionIndex},
> CU->getCompilationDir(),
> + Spec.FLIKind, Frame);
> } else {
> // Otherwise, use call file, call line and call column from
> // previous DIE in inlined chain.
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp Wed Feb 27
> 05:17:36 2019
> @@ -15,7 +15,7 @@ using namespace llvm;
> uint64_t DWARFDataExtractor::getRelocatedValue(uint32_t Size, uint32_t
> *Off,
> uint64_t *SecNdx) const {
> if (SecNdx)
> - *SecNdx = -1ULL;
> + *SecNdx = object::SectionedAddress::UndefSection;
> if (!Section)
> return getUnsigned(Off, Size);
> Optional<RelocAddrEntry> Rel = Obj->find(*Section, *Off);
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp Wed Feb 27 05:17:36
> 2019
> @@ -353,7 +353,8 @@ void DWARFDebugLine::Row::postAppend() {
> }
>
> void DWARFDebugLine::Row::reset(bool DefaultIsStmt) {
> - Address = 0;
> + Address.Address = 0;
> + Address.SectionIndex = object::SectionedAddress::UndefSection;
> Line = 1;
> Column = 0;
> File = 1;
> @@ -373,7 +374,7 @@ void DWARFDebugLine::Row::dumpTableHeade
> }
>
> void DWARFDebugLine::Row::dump(raw_ostream &OS) const {
> - OS << format("0x%16.16" PRIx64 " %6u %6u", Address, Line, Column)
> + OS << format("0x%16.16" PRIx64 " %6u %6u", Address.Address, Line,
> Column)
> << format(" %6u %3u %13u ", File, Isa, Discriminator)
> << (IsStmt ? " is_stmt" : "") << (BasicBlock ? " basic_block" : "")
> << (PrologueEnd ? " prologue_end" : "")
> @@ -386,6 +387,7 @@ DWARFDebugLine::Sequence::Sequence() { r
> void DWARFDebugLine::Sequence::reset() {
> LowPC = 0;
> HighPC = 0;
> + SectionIndex = object::SectionedAddress::UndefSection;
> FirstRowIndex = 0;
> LastRowIndex = 0;
> Empty = true;
> @@ -426,15 +428,16 @@ void DWARFDebugLine::ParsingState::appen
> if (Sequence.Empty) {
> // Record the beginning of instruction sequence.
> Sequence.Empty = false;
> - Sequence.LowPC = Row.Address;
> + Sequence.LowPC = Row.Address.Address;
> Sequence.FirstRowIndex = RowNumber;
> }
> ++RowNumber;
> LineTable->appendRow(Row);
> if (Row.EndSequence) {
> // Record the end of instruction sequence.
> - Sequence.HighPC = Row.Address;
> + Sequence.HighPC = Row.Address.Address;
> Sequence.LastRowIndex = RowNumber;
> + Sequence.SectionIndex = Row.Address.SectionIndex;
> if (Sequence.isValid())
> LineTable->appendSequence(Sequence);
> Sequence.reset();
> @@ -565,9 +568,10 @@ Error DWARFDebugLine::LineTable::parse(
> ExtOffset, DebugLineData.getAddressSize(),
> Len - 1);
> }
> - State.Row.Address = DebugLineData.getRelocatedAddress(OffsetPtr);
> + State.Row.Address.Address = DebugLineData.getRelocatedAddress(
> + OffsetPtr, &State.Row.Address.SectionIndex);
> if (OS)
> - *OS << format(" (0x%16.16" PRIx64 ")", State.Row.Address);
> + *OS << format(" (0x%16.16" PRIx64 ")",
> State.Row.Address.Address);
> break;
>
> case DW_LNE_define_file:
> @@ -654,7 +658,7 @@ Error DWARFDebugLine::LineTable::parse(
> {
> uint64_t AddrOffset =
> DebugLineData.getULEB128(OffsetPtr) *
> Prologue.MinInstLength;
> - State.Row.Address += AddrOffset;
> + State.Row.Address.Address += AddrOffset;
> if (OS)
> *OS << " (" << AddrOffset << ")";
> }
> @@ -712,7 +716,7 @@ Error DWARFDebugLine::LineTable::parse(
> uint8_t AdjustOpcode = 255 - Prologue.OpcodeBase;
> uint64_t AddrOffset =
> (AdjustOpcode / Prologue.LineRange) *
> Prologue.MinInstLength;
> - State.Row.Address += AddrOffset;
> + State.Row.Address.Address += AddrOffset;
> if (OS)
> *OS
> << format(" (0x%16.16" PRIx64 ")", AddrOffset);
> @@ -731,7 +735,7 @@ Error DWARFDebugLine::LineTable::parse(
> // can use DW_LNS_fixed_advance_pc instead, sacrificing
> compression.
> {
> uint16_t PCOffset = DebugLineData.getU16(OffsetPtr);
> - State.Row.Address += PCOffset;
> + State.Row.Address.Address += PCOffset;
> if (OS)
> *OS
> << format(" (0x%16.16" PRIx64 ")", PCOffset);
> @@ -814,7 +818,7 @@ Error DWARFDebugLine::LineTable::parse(
> int32_t LineOffset =
> Prologue.LineBase + (AdjustOpcode % Prologue.LineRange);
> State.Row.Line += LineOffset;
> - State.Row.Address += AddrOffset;
> + State.Row.Address.Address += AddrOffset;
>
> if (OS) {
> *OS << "address += " << AddrOffset << ", line += " << LineOffset
> @@ -850,11 +854,12 @@ Error DWARFDebugLine::LineTable::parse(
> return Error::success();
> }
>
> -uint32_t
> -DWARFDebugLine::LineTable::findRowInSeq(const DWARFDebugLine::Sequence
> &Seq,
> - uint64_t Address) const {
> +uint32_t DWARFDebugLine::LineTable::findRowInSeq(
> + const DWARFDebugLine::Sequence &Seq,
> + object::SectionedAddress Address) const {
> if (!Seq.containsPC(Address))
> return UnknownRowIndex;
> + assert(Seq.SectionIndex == Address.SectionIndex);
> // Search for instruction address in the rows describing the sequence.
> // Rows are stored in a vector, so we may use arithmetical operations
> with
> // iterators.
> @@ -867,8 +872,9 @@ DWARFDebugLine::LineTable::findRowInSeq(
> if (RowPos == LastRow) {
> return Seq.LastRowIndex - 1;
> }
> + assert(Seq.SectionIndex == RowPos->Address.SectionIndex);
> uint32_t Index = Seq.FirstRowIndex + (RowPos - FirstRow);
> - if (RowPos->Address > Address) {
> + if (RowPos->Address.Address > Address.Address) {
> if (RowPos == FirstRow)
> return UnknownRowIndex;
> else
> @@ -877,42 +883,81 @@ DWARFDebugLine::LineTable::findRowInSeq(
> return Index;
> }
>
> -uint32_t DWARFDebugLine::LineTable::lookupAddress(uint64_t Address) const
> {
> +uint32_t DWARFDebugLine::LineTable::lookupAddress(
> + object::SectionedAddress Address) const {
> +
> + // Search for relocatable addresses
> + uint32_t Result = lookupAddressImpl(Address);
> +
> + if (Result != UnknownRowIndex ||
> + Address.SectionIndex == object::SectionedAddress::UndefSection)
> + return Result;
> +
> + // Search for absolute addresses
> + Address.SectionIndex = object::SectionedAddress::UndefSection;
> + return lookupAddressImpl(Address);
> +}
> +
> +uint32_t DWARFDebugLine::LineTable::lookupAddressImpl(
> + object::SectionedAddress Address) const {
> if (Sequences.empty())
> return UnknownRowIndex;
> // First, find an instruction sequence containing the given address.
> DWARFDebugLine::Sequence Sequence;
> - Sequence.LowPC = Address;
> + Sequence.SectionIndex = Address.SectionIndex;
> + Sequence.LowPC = Address.Address;
> SequenceIter FirstSeq = Sequences.begin();
> SequenceIter LastSeq = Sequences.end();
> SequenceIter SeqPos = std::lower_bound(
> FirstSeq, LastSeq, Sequence,
> DWARFDebugLine::Sequence::orderByLowPC);
> DWARFDebugLine::Sequence FoundSeq;
> +
> if (SeqPos == LastSeq) {
> FoundSeq = Sequences.back();
> - } else if (SeqPos->LowPC == Address) {
> + } else if (SeqPos->LowPC == Address.Address &&
> + SeqPos->SectionIndex == Address.SectionIndex) {
> FoundSeq = *SeqPos;
> } else {
> if (SeqPos == FirstSeq)
> return UnknownRowIndex;
> FoundSeq = *(SeqPos - 1);
> }
> + if (FoundSeq.SectionIndex != Address.SectionIndex)
> + return UnknownRowIndex;
> return findRowInSeq(FoundSeq, Address);
> }
>
> bool DWARFDebugLine::LineTable::lookupAddressRange(
> - uint64_t Address, uint64_t Size, std::vector<uint32_t> &Result) const
> {
> + object::SectionedAddress Address, uint64_t Size,
> + std::vector<uint32_t> &Result) const {
> +
> + // Search for relocatable addresses
> + if (lookupAddressRangeImpl(Address, Size, Result))
> + return true;
> +
> + if (Address.SectionIndex == object::SectionedAddress::UndefSection)
> + return false;
> +
> + // Search for absolute addresses
> + Address.SectionIndex = object::SectionedAddress::UndefSection;
> + return lookupAddressRangeImpl(Address, Size, Result);
> +}
> +
> +bool DWARFDebugLine::LineTable::lookupAddressRangeImpl(
> + object::SectionedAddress Address, uint64_t Size,
> + std::vector<uint32_t> &Result) const {
> if (Sequences.empty())
> return false;
> - uint64_t EndAddr = Address + Size;
> + uint64_t EndAddr = Address.Address + Size;
> // First, find an instruction sequence containing the given address.
> DWARFDebugLine::Sequence Sequence;
> - Sequence.LowPC = Address;
> + Sequence.SectionIndex = Address.SectionIndex;
> + Sequence.LowPC = Address.Address;
> SequenceIter FirstSeq = Sequences.begin();
> SequenceIter LastSeq = Sequences.end();
> SequenceIter SeqPos = std::lower_bound(
> FirstSeq, LastSeq, Sequence,
> DWARFDebugLine::Sequence::orderByLowPC);
> - if (SeqPos == LastSeq || SeqPos->LowPC != Address) {
> + if (SeqPos == LastSeq || !SeqPos->containsPC(Address)) {
> if (SeqPos == FirstSeq)
> return false;
> SeqPos--;
> @@ -934,7 +979,8 @@ bool DWARFDebugLine::LineTable::lookupAd
> FirstRowIndex = findRowInSeq(CurSeq, Address);
>
> // Figure out the last row in the range.
> - uint32_t LastRowIndex = findRowInSeq(CurSeq, EndAddr - 1);
> + uint32_t LastRowIndex =
> + findRowInSeq(CurSeq, {EndAddr - 1, Address.SectionIndex});
> if (LastRowIndex == UnknownRowIndex)
> LastRowIndex = CurSeq.LastRowIndex - 1;
>
> @@ -1011,8 +1057,8 @@ bool DWARFDebugLine::LineTable::getFileN
> }
>
> bool DWARFDebugLine::LineTable::getFileLineInfoForAddress(
> - uint64_t Address, const char *CompDir, FileLineInfoKind Kind,
> - DILineInfo &Result) const {
> + object::SectionedAddress Address, const char *CompDir,
> + FileLineInfoKind Kind, DILineInfo &Result) const {
> // Get the index of row we're looking for in the line table.
> uint32_t RowIndex = lookupAddress(Address);
> if (RowIndex == -1U)
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp Wed Feb 27
> 05:17:36 2019
> @@ -68,7 +68,7 @@ void DWARFDebugRangeList::dump(raw_ostre
> }
>
> DWARFAddressRangesVector DWARFDebugRangeList::getAbsoluteRanges(
> - llvm::Optional<SectionedAddress> BaseAddr) const {
> + llvm::Optional<object::SectionedAddress> BaseAddr) const {
> DWARFAddressRangesVector Res;
> for (const RangeListEntry &RLE : Entries) {
> if (RLE.isBaseAddressSelectionEntry(AddressSize)) {
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp Wed Feb 27
> 05:17:36 2019
> @@ -112,9 +112,8 @@ Error RangeListEntry::extract(DWARFDataE
> return Error::success();
> }
>
> -DWARFAddressRangesVector
> -DWARFDebugRnglist::getAbsoluteRanges(llvm::Optional<SectionedAddress>
> BaseAddr,
> - DWARFUnit &U) const {
> +DWARFAddressRangesVector DWARFDebugRnglist::getAbsoluteRanges(
> + llvm::Optional<object::SectionedAddress> BaseAddr, DWARFUnit &U)
> const {
> DWARFAddressRangesVector Res;
> for (const RangeListEntry &RLE : Entries) {
> if (RLE.EntryKind == dwarf::DW_RLE_end_of_list)
> @@ -174,7 +173,7 @@ DWARFDebugRnglist::getAbsoluteRanges(llv
> void RangeListEntry::dump(
> raw_ostream &OS, uint8_t AddrSize, uint8_t MaxEncodingStringLength,
> uint64_t &CurrentBase, DIDumpOptions DumpOpts,
> - llvm::function_ref<Optional<SectionedAddress>(uint32_t)>
> + llvm::function_ref<Optional<object::SectionedAddress>(uint32_t)>
> LookupPooledAddress) const {
> auto PrintRawEntry = [](raw_ostream &OS, const RangeListEntry &Entry,
> uint8_t AddrSize, DIDumpOptions DumpOpts) {
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp Wed Feb 27 05:17:36 2019
> @@ -100,7 +100,7 @@ static void dumpLocation(raw_ostream &OS
> auto LL = DebugLoc.parseOneLocationList(Data, &Offset);
> if (LL) {
> uint64_t BaseAddr = 0;
> - if (Optional<SectionedAddress> BA = U->getBaseAddress())
> + if (Optional<object::SectionedAddress> BA = U->getBaseAddress())
> BaseAddr = BA->Address;
> LL->dump(OS, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI, U,
> BaseAddr, Indent);
> @@ -125,7 +125,7 @@ static void dumpLocation(raw_ostream &OS
> Data, &Offset, UseLocLists ? U->getVersion() : 4);
>
> uint64_t BaseAddr = 0;
> - if (Optional<SectionedAddress> BA = U->getBaseAddress())
> + if (Optional<object::SectionedAddress> BA = U->getBaseAddress())
> BaseAddr = BA->Address;
>
> if (LL)
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp Wed Feb 27 05:17:36
> 2019
> @@ -360,7 +360,7 @@ bool DWARFFormValue::extractValue(const
>
> void DWARFFormValue::dumpSectionedAddress(raw_ostream &OS,
> DIDumpOptions DumpOpts,
> - SectionedAddress SA) const {
> + object::SectionedAddress SA)
> const {
> OS << format("0x%016" PRIx64, SA.Address);
> dumpAddressSection(U->getContext().getDWARFObj(), OS, DumpOpts,
> SA.SectionIndex);
> @@ -397,7 +397,7 @@ void DWARFFormValue::dump(raw_ostream &O
> case DW_FORM_addrx3:
> case DW_FORM_addrx4:
> case DW_FORM_GNU_addr_index: {
> - Optional<SectionedAddress> A = U->getAddrOffsetSectionItem(UValue);
> + Optional<object::SectionedAddress> A =
> U->getAddrOffsetSectionItem(UValue);
> if (!A || DumpOpts.Verbose)
> AddrOS << format("indexed (%8.8x) address = ", (uint32_t)UValue);
> if (U == nullptr)
> @@ -618,14 +618,15 @@ Optional<uint64_t> DWARFFormValue::getAs
> return SA->Address;
> return None;
> }
> -Optional<SectionedAddress> DWARFFormValue::getAsSectionedAddress() const {
> +Optional<object::SectionedAddress>
> +DWARFFormValue::getAsSectionedAddress() const {
> if (!isFormClass(FC_Address))
> return None;
> if (Form == DW_FORM_GNU_addr_index || Form == DW_FORM_addrx) {
> uint32_t Index = Value.uval;
> if (!U)
> return None;
> - Optional<SectionedAddress> SA = U->getAddrOffsetSectionItem(Index);
> + Optional<object::SectionedAddress> SA =
> U->getAddrOffsetSectionItem(Index);
> if (!SA)
> return None;
> return SA;
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp Wed Feb 27 05:17:36 2019
> @@ -197,7 +197,7 @@ DWARFDataExtractor DWARFUnit::getDebugIn
> getAddressByteSize());
> }
>
> -Optional<SectionedAddress>
> +Optional<object::SectionedAddress>
> DWARFUnit::getAddrOffsetSectionItem(uint32_t Index) const {
> if (IsDWO) {
> auto R = Context.info_section_units();
> @@ -744,7 +744,7 @@ const DWARFAbbreviationDeclarationSet *D
> return Abbrevs;
> }
>
> -llvm::Optional<SectionedAddress> DWARFUnit::getBaseAddress() {
> +llvm::Optional<object::SectionedAddress> DWARFUnit::getBaseAddress() {
> if (BaseAddr)
> return BaseAddr;
>
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp Wed Feb 27 05:17:36
> 2019
> @@ -772,7 +772,7 @@ void DWARFVerifier::verifyDebugLineRows(
> uint32_t RowIndex = 0;
> for (const auto &Row : LineTable->Rows) {
> // Verify row address.
> - if (Row.Address < PrevAddress) {
> + if (Row.Address.Address < PrevAddress) {
> ++NumDebugLineErrors;
> error() << ".debug_line["
> << format("0x%08" PRIx64,
> @@ -802,7 +802,7 @@ void DWARFVerifier::verifyDebugLineRows(
> if (Row.EndSequence)
> PrevAddress = 0;
> else
> - PrevAddress = Row.Address;
> + PrevAddress = Row.Address.Address;
> ++RowIndex;
> }
> }
>
> Modified: llvm/trunk/lib/DebugInfo/PDB/PDBContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/PDBContext.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/PDB/PDBContext.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/PDB/PDBContext.cpp Wed Feb 27 05:17:36 2019
> @@ -30,14 +30,14 @@ PDBContext::PDBContext(const COFFObjectF
>
> void PDBContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts){}
>
> -DILineInfo PDBContext::getLineInfoForAddress(uint64_t Address,
> +DILineInfo PDBContext::getLineInfoForAddress(object::SectionedAddress
> Address,
> DILineInfoSpecifier
> Specifier) {
> DILineInfo Result;
> - Result.FunctionName = getFunctionName(Address, Specifier.FNKind);
> + Result.FunctionName = getFunctionName(Address.Address,
> Specifier.FNKind);
>
> uint32_t Length = 1;
> std::unique_ptr<PDBSymbol> Symbol =
> - Session->findSymbolByAddress(Address, PDB_SymType::None);
> + Session->findSymbolByAddress(Address.Address, PDB_SymType::None);
> if (auto Func = dyn_cast_or_null<PDBSymbolFunc>(Symbol.get())) {
> Length = Func->getLength();
> } else if (auto Data = dyn_cast_or_null<PDBSymbolData>(Symbol.get())) {
> @@ -46,7 +46,7 @@ DILineInfo PDBContext::getLineInfoForAdd
>
> // If we couldn't find a symbol, then just assume 1 byte, so that we get
> // only the line number of the first instruction.
> - auto LineNumbers = Session->findLineNumbersByAddress(Address, Length);
> + auto LineNumbers = Session->findLineNumbersByAddress(Address.Address,
> Length);
> if (!LineNumbers || LineNumbers->getChildCount() == 0)
> return Result;
>
> @@ -63,26 +63,27 @@ DILineInfo PDBContext::getLineInfoForAdd
> }
>
> DILineInfoTable
> -PDBContext::getLineInfoForAddressRange(uint64_t Address, uint64_t Size,
> +PDBContext::getLineInfoForAddressRange(object::SectionedAddress Address,
> + uint64_t Size,
> DILineInfoSpecifier Specifier) {
> if (Size == 0)
> return DILineInfoTable();
>
> DILineInfoTable Table;
> - auto LineNumbers = Session->findLineNumbersByAddress(Address, Size);
> + auto LineNumbers = Session->findLineNumbersByAddress(Address.Address,
> Size);
> if (!LineNumbers || LineNumbers->getChildCount() == 0)
> return Table;
>
> while (auto LineInfo = LineNumbers->getNext()) {
> - DILineInfo LineEntry =
> - getLineInfoForAddress(LineInfo->getVirtualAddress(), Specifier);
> + DILineInfo LineEntry = getLineInfoForAddress(
> + {LineInfo->getVirtualAddress(), Address.SectionIndex}, Specifier);
> Table.push_back(std::make_pair(LineInfo->getVirtualAddress(),
> LineEntry));
> }
> return Table;
> }
>
> DIInliningInfo
> -PDBContext::getInliningInfoForAddress(uint64_t Address,
> +PDBContext::getInliningInfoForAddress(object::SectionedAddress Address,
> DILineInfoSpecifier Specifier) {
> DIInliningInfo InlineInfo;
> DILineInfo Frame = getLineInfoForAddress(Address, Specifier);
>
> Modified: llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
> (original)
> +++ llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp Wed Feb
> 27 05:17:36 2019
> @@ -222,9 +222,10 @@ bool SymbolizableObjectFile::shouldOverr
> isa<DWARFContext>(DebugInfoContext.get());
> }
>
> -DILineInfo SymbolizableObjectFile::symbolizeCode(uint64_t ModuleOffset,
> - FunctionNameKind FNKind,
> - bool UseSymbolTable)
> const {
> +DILineInfo
> +SymbolizableObjectFile::symbolizeCode(object::SectionedAddress
> ModuleOffset,
> + FunctionNameKind FNKind,
> + bool UseSymbolTable) const {
> DILineInfo LineInfo;
> if (DebugInfoContext) {
> LineInfo = DebugInfoContext->getLineInfoForAddress(
> @@ -234,7 +235,7 @@ DILineInfo SymbolizableObjectFile::symbo
> if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) {
> std::string FunctionName;
> uint64_t Start, Size;
> - if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset,
> + if (getNameFromSymbolTable(SymbolRef::ST_Function,
> ModuleOffset.Address,
> FunctionName, Start, Size)) {
> LineInfo.FunctionName = FunctionName;
> }
> @@ -243,7 +244,8 @@ DILineInfo SymbolizableObjectFile::symbo
> }
>
> DIInliningInfo SymbolizableObjectFile::symbolizeInlinedCode(
> - uint64_t ModuleOffset, FunctionNameKind FNKind, bool UseSymbolTable)
> const {
> + object::SectionedAddress ModuleOffset, FunctionNameKind FNKind,
> + bool UseSymbolTable) const {
> DIInliningInfo InlinedContext;
>
> if (DebugInfoContext)
> @@ -257,7 +259,7 @@ DIInliningInfo SymbolizableObjectFile::s
> if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) {
> std::string FunctionName;
> uint64_t Start, Size;
> - if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset,
> + if (getNameFromSymbolTable(SymbolRef::ST_Function,
> ModuleOffset.Address,
> FunctionName, Start, Size)) {
> InlinedContext.getMutableFrame(InlinedContext.getNumberOfFrames() -
> 1)
> ->FunctionName = FunctionName;
> @@ -267,9 +269,10 @@ DIInliningInfo SymbolizableObjectFile::s
> return InlinedContext;
> }
>
> -DIGlobal SymbolizableObjectFile::symbolizeData(uint64_t ModuleOffset)
> const {
> +DIGlobal SymbolizableObjectFile::symbolizeData(
> + object::SectionedAddress ModuleOffset) const {
> DIGlobal Res;
> - getNameFromSymbolTable(SymbolRef::ST_Data, ModuleOffset, Res.Name,
> Res.Start,
> - Res.Size);
> + getNameFromSymbolTable(SymbolRef::ST_Data, ModuleOffset.Address,
> Res.Name,
> + Res.Start, Res.Size);
> return Res;
> }
>
> Modified: llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h (original)
> +++ llvm/trunk/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h Wed Feb 27
> 05:17:36 2019
> @@ -33,12 +33,13 @@ public:
> static ErrorOr<std::unique_ptr<SymbolizableObjectFile>>
> create(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx);
>
> - DILineInfo symbolizeCode(uint64_t ModuleOffset, FunctionNameKind FNKind,
> + DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset,
> + FunctionNameKind FNKind,
> bool UseSymbolTable) const override;
> - DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset,
> + DIInliningInfo symbolizeInlinedCode(object::SectionedAddress
> ModuleOffset,
> FunctionNameKind FNKind,
> bool UseSymbolTable) const override;
> - DIGlobal symbolizeData(uint64_t ModuleOffset) const override;
> + DIGlobal symbolizeData(object::SectionedAddress ModuleOffset) const
> override;
>
> // Return true if this is a 32-bit x86 PE COFF module.
> bool isWin32Module() const override;
>
> Modified: llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp Wed Feb 27 05:17:36
> 2019
> @@ -52,7 +52,8 @@ namespace symbolize {
>
> Expected<DILineInfo>
> LLVMSymbolizer::symbolizeCode(const std::string &ModuleName,
> - uint64_t ModuleOffset, StringRef DWPName) {
> + object::SectionedAddress ModuleOffset,
> + StringRef DWPName) {
> SymbolizableModule *Info;
> if (auto InfoOrErr = getOrCreateModuleInfo(ModuleName, DWPName))
> Info = InfoOrErr.get();
> @@ -67,7 +68,7 @@ LLVMSymbolizer::symbolizeCode(const std:
> // If the user is giving us relative addresses, add the preferred base
> of the
> // object to the offset before we do the query. It's what DIContext
> expects.
> if (Opts.RelativeAddresses)
> - ModuleOffset += Info->getModulePreferredBase();
> + ModuleOffset.Address += Info->getModulePreferredBase();
>
> DILineInfo LineInfo = Info->symbolizeCode(ModuleOffset,
> Opts.PrintFunctions,
> Opts.UseSymbolTable);
> @@ -78,7 +79,8 @@ LLVMSymbolizer::symbolizeCode(const std:
>
> Expected<DIInliningInfo>
> LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName,
> - uint64_t ModuleOffset, StringRef
> DWPName) {
> + object::SectionedAddress
> ModuleOffset,
> + StringRef DWPName) {
> SymbolizableModule *Info;
> if (auto InfoOrErr = getOrCreateModuleInfo(ModuleName, DWPName))
> Info = InfoOrErr.get();
> @@ -93,7 +95,7 @@ LLVMSymbolizer::symbolizeInlinedCode(con
> // If the user is giving us relative addresses, add the preferred base
> of the
> // object to the offset before we do the query. It's what DIContext
> expects.
> if (Opts.RelativeAddresses)
> - ModuleOffset += Info->getModulePreferredBase();
> + ModuleOffset.Address += Info->getModulePreferredBase();
>
> DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
> ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable);
> @@ -106,8 +108,9 @@ LLVMSymbolizer::symbolizeInlinedCode(con
> return InlinedContext;
> }
>
> -Expected<DIGlobal> LLVMSymbolizer::symbolizeData(const std::string
> &ModuleName,
> - uint64_t ModuleOffset) {
> +Expected<DIGlobal>
> +LLVMSymbolizer::symbolizeData(const std::string &ModuleName,
> + object::SectionedAddress ModuleOffset) {
> SymbolizableModule *Info;
> if (auto InfoOrErr = getOrCreateModuleInfo(ModuleName))
> Info = InfoOrErr.get();
> @@ -123,7 +126,7 @@ Expected<DIGlobal> LLVMSymbolizer::symbo
> // the object to the offset before we do the query. It's what DIContext
> // expects.
> if (Opts.RelativeAddresses)
> - ModuleOffset += Info->getModulePreferredBase();
> + ModuleOffset.Address += Info->getModulePreferredBase();
>
> DIGlobal Global = Info->symbolizeData(ModuleOffset);
> if (Opts.Demangle)
>
> Added:
> llvm/trunk/test/tools/llvm-objdump/X86/function-sections-line-numbers.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/function-sections-line-numbers.s?rev=354972&view=auto
>
> ==============================================================================
> ---
> llvm/trunk/test/tools/llvm-objdump/X86/function-sections-line-numbers.s
> (added)
> +++
> llvm/trunk/test/tools/llvm-objdump/X86/function-sections-line-numbers.s Wed
> Feb 27 05:17:36 2019
> @@ -0,0 +1,221 @@
> +# The code below is the reduced version of the output
> +# from the following invocation and source:
> +#
> +# // test.cpp:
> +#void f1() {}
> +#void f2() {}
> +#
> +# clang -gdwarf-5 -ffunction-sections test.cpp -o test.s -S
> +
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux
> -dwarf-version=5 %s -o %t.o
> +# RUN: llvm-objdump -disassemble -line-numbers -r -s -section-headers -t
> %t.o | FileCheck %s
> +
> +
> +# CHECK: 0000000000000000 _Z2f1v
> +# CHECK-NOT: test.cpp:2
> +# CHECK: test.cpp:1
> +# CHECK-NOT: test.cpp:2
> +# CHECK: 0000000000000000 _Z2f2v
> +# CHECK-NOT: test.cpp:1
> +# CHECK: test.cpp:2
> +# CHECK-NOT: test.cpp:1
> +
> +
> + .text
> + .file "test.cpp"
> + .section .text._Z2f1v,"ax", at progbits
> + .globl _Z2f1v # -- Begin function _Z2f1v
> + .p2align 4, 0x90
> + .type _Z2f1v, at function
> +_Z2f1v: # @_Z2f1v
> +.Lfunc_begin0:
> + .file 0 "/home/avl" "test.cpp" md5
> 0xefae234cc05b45384d782316d3a5d338
> + .file 1 "test.cpp" md5 0xefae234cc05b45384d782316d3a5d338
> + .loc 1 1 0 # test.cpp:1:0
> + .cfi_startproc
> +# %bb.0: # %entry
> + pushq %rbp
> + .cfi_def_cfa_offset 16
> + .cfi_offset %rbp, -16
> + movq %rsp, %rbp
> + .cfi_def_cfa_register %rbp
> +.Ltmp0:
> + .loc 1 1 12 prologue_end # test.cpp:1:12
> + popq %rbp
> + .cfi_def_cfa %rsp, 8
> + retq
> +.Ltmp1:
> +.Lfunc_end0:
> + .size _Z2f1v, .Lfunc_end0-_Z2f1v
> + .cfi_endproc
> + # -- End function
> + .section .text._Z2f2v,"ax", at progbits
> + .globl _Z2f2v # -- Begin function _Z2f2v
> + .p2align 4, 0x90
> + .type _Z2f2v, at function
> +_Z2f2v: # @_Z2f2v
> +.Lfunc_begin1:
> + .loc 1 2 0 # test.cpp:2:0
> + .cfi_startproc
> +# %bb.0: # %entry
> + pushq %rbp
> + .cfi_def_cfa_offset 16
> + .cfi_offset %rbp, -16
> + movq %rsp, %rbp
> + .cfi_def_cfa_register %rbp
> +.Ltmp2:
> + .loc 1 2 12 prologue_end # test.cpp:2:12
> + popq %rbp
> + .cfi_def_cfa %rsp, 8
> + retq
> +.Ltmp3:
> +.Lfunc_end1:
> + .size _Z2f2v, .Lfunc_end1-_Z2f2v
> + .cfi_endproc
> + # -- End function
> + .section .debug_str_offsets,"", at progbits
> + .long 32
> + .short 5
> + .short 0
> +.Lstr_offsets_base0:
> + .section .debug_str,"MS", at progbits,1
> +.Linfo_string0:
> + .asciz "clang version 9.0.0 (
> https://github.com/llvm/llvm-project.git
> ebfc1e5af7a65381d858612517e6414ef58df482)" # string offset=0
> +.Linfo_string1:
> + .asciz "test.cpp" # string offset=104
> +.Linfo_string2:
> + .asciz "/home/avl" # string offset=113
> +.Linfo_string3:
> + .asciz "_Z2f1v" # string offset=123
> +.Linfo_string4:
> + .asciz "f1" # string offset=130
> +.Linfo_string5:
> + .asciz "_Z2f2v" # string offset=133
> +.Linfo_string6:
> + .asciz "f2" # string offset=140
> + .section .debug_str_offsets,"", at progbits
> + .long .Linfo_string0
> + .long .Linfo_string1
> + .long .Linfo_string2
> + .long .Linfo_string3
> + .long .Linfo_string4
> + .long .Linfo_string5
> + .long .Linfo_string6
> + .section .debug_abbrev,"", at progbits
> + .byte 1 # Abbreviation Code
> + .byte 17 # DW_TAG_compile_unit
> + .byte 1 # DW_CHILDREN_yes
> + .byte 37 # DW_AT_producer
> + .byte 37 # DW_FORM_strx1
> + .byte 19 # DW_AT_language
> + .byte 5 # DW_FORM_data2
> + .byte 3 # DW_AT_name
> + .byte 37 # DW_FORM_strx1
> + .byte 114 # DW_AT_str_offsets_base
> + .byte 23 # DW_FORM_sec_offset
> + .byte 16 # DW_AT_stmt_list
> + .byte 23 # DW_FORM_sec_offset
> + .byte 27 # DW_AT_comp_dir
> + .byte 37 # DW_FORM_strx1
> + .byte 115 # DW_AT_addr_base
> + .byte 23 # DW_FORM_sec_offset
> + .byte 17 # DW_AT_low_pc
> + .byte 1 # DW_FORM_addr
> + .byte 85 # DW_AT_ranges
> + .byte 35 # DW_FORM_rnglistx
> + .byte 116 # DW_AT_rnglists_base
> + .byte 23 # DW_FORM_sec_offset
> + .byte 0 # EOM(1)
> + .byte 0 # EOM(2)
> + .byte 2 # Abbreviation Code
> + .byte 46 # DW_TAG_subprogram
> + .byte 0 # DW_CHILDREN_no
> + .byte 17 # DW_AT_low_pc
> + .byte 27 # DW_FORM_addrx
> + .byte 18 # DW_AT_high_pc
> + .byte 6 # DW_FORM_data4
> + .byte 64 # DW_AT_frame_base
> + .byte 24 # DW_FORM_exprloc
> + .byte 110 # DW_AT_linkage_name
> + .byte 37 # DW_FORM_strx1
> + .byte 3 # DW_AT_name
> + .byte 37 # DW_FORM_strx1
> + .byte 58 # DW_AT_decl_file
> + .byte 11 # DW_FORM_data1
> + .byte 59 # DW_AT_decl_line
> + .byte 11 # DW_FORM_data1
> + .byte 63 # DW_AT_external
> + .byte 25 # DW_FORM_flag_present
> + .byte 0 # EOM(1)
> + .byte 0 # EOM(2)
> + .byte 0 # EOM(3)
> + .section .debug_info,"", at progbits
> +.Lcu_begin0:
> + .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
> +.Ldebug_info_start0:
> + .short 5 # DWARF version number
> + .byte 1 # DWARF Unit Type
> + .byte 8 # Address Size (in bytes)
> + .long .debug_abbrev # Offset Into Abbrev. Section
> + .byte 1 # Abbrev [1] 0xc:0x38
> DW_TAG_compile_unit
> + .byte 0 # DW_AT_producer
> + .short 4 # DW_AT_language
> + .byte 1 # DW_AT_name
> + .long .Lstr_offsets_base0 # DW_AT_str_offsets_base
> + .long .Lline_table_start0 # DW_AT_stmt_list
> + .byte 2 # DW_AT_comp_dir
> + .long .Laddr_table_base0 # DW_AT_addr_base
> + .quad 0 # DW_AT_low_pc
> + .byte 0 # DW_AT_ranges
> + .long .Lrnglists_table_base0 # DW_AT_rnglists_base
> + .byte 2 # Abbrev [2] 0x2b:0xc
> DW_TAG_subprogram
> + .byte 0 # DW_AT_low_pc
> + .long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc
> + .byte 1 # DW_AT_frame_base
> + .byte 86
> + .byte 3 # DW_AT_linkage_name
> + .byte 4 # DW_AT_name
> + .byte 1 # DW_AT_decl_file
> + .byte 1 # DW_AT_decl_line
> + # DW_AT_external
> + .byte 2 # Abbrev [2] 0x37:0xc
> DW_TAG_subprogram
> + .byte 1 # DW_AT_low_pc
> + .long .Lfunc_end1-.Lfunc_begin1 # DW_AT_high_pc
> + .byte 1 # DW_AT_frame_base
> + .byte 86
> + .byte 5 # DW_AT_linkage_name
> + .byte 6 # DW_AT_name
> + .byte 1 # DW_AT_decl_file
> + .byte 2 # DW_AT_decl_line
> + # DW_AT_external
> + .byte 0 # End Of Children Mark
> +.Ldebug_info_end0:
> + .section .debug_rnglists,"", at progbits
> + .long .Ldebug_rnglist_table_end0-.Ldebug_rnglist_table_start0 #
> Length
> +.Ldebug_rnglist_table_start0:
> + .short 5 # Version
> + .byte 8 # Address size
> + .byte 0 # Segment selector size
> + .long 1 # Offset entry count
> +.Lrnglists_table_base0:
> + .long .Ldebug_ranges0-.Lrnglists_table_base0
> +.Ldebug_ranges0:
> + .byte 3 # DW_RLE_startx_length
> + .byte 0 # start index
> + .uleb128 .Lfunc_end0-.Lfunc_begin0 # length
> + .byte 3 # DW_RLE_startx_length
> + .byte 1 # start index
> + .uleb128 .Lfunc_end1-.Lfunc_begin1 # length
> + .byte 0 # DW_RLE_end_of_list
> +.Ldebug_rnglist_table_end0:
> +.Ldebug_addr_start0:
> + .short 5 # DWARF version number
> + .byte 8 # Address size
> + .byte 0 # Segment selector size
> +.Laddr_table_base0:
> + .quad .Lfunc_begin0
> + .quad .Lfunc_begin1
> +.Ldebug_addr_end0:
> +
> + .section .debug_line,"", at progbits
> +.Lline_table_start0:
>
> Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Wed Feb 27 05:17:36 2019
> @@ -1734,17 +1734,17 @@ void DwarfLinker::patchLineTableForUnit(
> // it is marked as end_sequence in the input (because in that
> // case, the relocation offset is accurate and that entry won't
> // serve as the start of another function).
> - if (CurrRange == InvalidRange || Row.Address < CurrRange.start() ||
> - Row.Address > CurrRange.stop() ||
> - (Row.Address == CurrRange.stop() && !Row.EndSequence)) {
> + if (CurrRange == InvalidRange || Row.Address.Address <
> CurrRange.start() ||
> + Row.Address.Address > CurrRange.stop() ||
> + (Row.Address.Address == CurrRange.stop() && !Row.EndSequence)) {
> // We just stepped out of a known range. Insert a end_sequence
> // corresponding to the end of the range.
> uint64_t StopAddress = CurrRange != InvalidRange
> ? CurrRange.stop() + CurrRange.value()
> : -1ULL;
> - CurrRange = FunctionRanges.find(Row.Address);
> + CurrRange = FunctionRanges.find(Row.Address.Address);
> bool CurrRangeValid =
> - CurrRange != InvalidRange && CurrRange.start() <= Row.Address;
> + CurrRange != InvalidRange && CurrRange.start() <=
> Row.Address.Address;
> if (!CurrRangeValid) {
> CurrRange = InvalidRange;
> if (StopAddress != -1ULL) {
> @@ -1754,13 +1754,13 @@ void DwarfLinker::patchLineTableForUnit(
> // for now do as dsymutil.
> // FIXME: Understand exactly what cases this addresses and
> // potentially remove it along with the Ranges map.
> - auto Range = Ranges.lower_bound(Row.Address);
> + auto Range = Ranges.lower_bound(Row.Address.Address);
> if (Range != Ranges.begin() && Range != Ranges.end())
> --Range;
>
> - if (Range != Ranges.end() && Range->first <= Row.Address &&
> - Range->second.HighPC >= Row.Address) {
> - StopAddress = Row.Address + Range->second.Offset;
> + if (Range != Ranges.end() && Range->first <=
> Row.Address.Address &&
> + Range->second.HighPC >= Row.Address.Address) {
> + StopAddress = Row.Address.Address + Range->second.Offset;
> }
> }
> }
> @@ -1768,7 +1768,7 @@ void DwarfLinker::patchLineTableForUnit(
> // Insert end sequence row with the computed end address, but
> // the same line as the previous one.
> auto NextLine = Seq.back();
> - NextLine.Address = StopAddress;
> + NextLine.Address.Address = StopAddress;
> NextLine.EndSequence = 1;
> NextLine.PrologueEnd = 0;
> NextLine.BasicBlock = 0;
> @@ -1786,7 +1786,7 @@ void DwarfLinker::patchLineTableForUnit(
> continue;
>
> // Relocate row address and add it to the current sequence.
> - Row.Address += CurrRange.value();
> + Row.Address.Address += CurrRange.value();
> Seq.emplace_back(Row);
>
> if (Row.EndSequence)
>
> Modified: llvm/trunk/tools/dsymutil/DwarfStreamer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfStreamer.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/dsymutil/DwarfStreamer.cpp (original)
> +++ llvm/trunk/tools/dsymutil/DwarfStreamer.cpp Wed Feb 27 05:17:36 2019
> @@ -480,11 +480,11 @@ void DwarfStreamer::emitLineTableForUnit
> MS->EmitIntValue(dwarf::DW_LNS_extended_op, 1);
> MS->EmitULEB128IntValue(PointerSize + 1);
> MS->EmitIntValue(dwarf::DW_LNE_set_address, 1);
> - MS->EmitIntValue(Row.Address, PointerSize);
> + MS->EmitIntValue(Row.Address.Address, PointerSize);
> LineSectionSize += 2 + PointerSize + getULEB128Size(PointerSize +
> 1);
> AddressDelta = 0;
> } else {
> - AddressDelta = (Row.Address - Address) / MinInstLength;
> + AddressDelta = (Row.Address.Address - Address) / MinInstLength;
> }
>
> // FIXME: code copied and transformed from
> MCDwarf.cpp::EmitDwarfLineTable.
> @@ -540,7 +540,7 @@ void DwarfStreamer::emitLineTableForUnit
> MS->EmitBytes(EncodingOS.str());
> LineSectionSize += EncodingBuffer.size();
> EncodingBuffer.resize(0);
> - Address = Row.Address;
> + Address = Row.Address.Address;
> LastLine = Row.Line;
> RowsSinceLastSequence++;
> } else {
>
> Modified: llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.cpp (original)
> +++ llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.cpp Wed Feb 27
> 05:17:36 2019
> @@ -254,7 +254,8 @@ FileAnalysis::getDirectControlFlowXRefs(
> return CFCrossReferences;
> }
>
> -const std::set<uint64_t> &FileAnalysis::getIndirectInstructions() const {
> +const std::set<object::SectionedAddress> &
> +FileAnalysis::getIndirectInstructions() const {
> return IndirectInstructions;
> }
>
> @@ -268,8 +269,10 @@ const MCInstrAnalysis *FileAnalysis::get
> return MIA.get();
> }
>
> -Expected<DIInliningInfo> FileAnalysis::symbolizeInlinedCode(uint64_t
> Address) {
> +Expected<DIInliningInfo>
> +FileAnalysis::symbolizeInlinedCode(object::SectionedAddress Address) {
> assert(Symbolizer != nullptr && "Symbolizer is invalid.");
> +
> return Symbolizer->symbolizeInlinedCode(Object->getFileName(), Address);
> }
>
> @@ -457,13 +460,14 @@ Error FileAnalysis::parseCodeSections()
>
> ArrayRef<uint8_t> SectionBytes((const uint8_t
> *)SectionContents.data(),
> Section.getSize());
> - parseSectionContents(SectionBytes, Section.getAddress());
> + parseSectionContents(SectionBytes,
> + {Section.getAddress(), Section.getIndex()});
> }
> return Error::success();
> }
>
> void FileAnalysis::parseSectionContents(ArrayRef<uint8_t> SectionBytes,
> - uint64_t SectionAddress) {
> + object::SectionedAddress Address)
> {
> assert(Symbolizer && "Symbolizer is uninitialised.");
> MCInst Instruction;
> Instr InstrMeta;
> @@ -477,7 +481,7 @@ void FileAnalysis::parseSectionContents(
>
> Byte += InstructionSize;
>
> - uint64_t VMAddress = SectionAddress + Byte - InstructionSize;
> + uint64_t VMAddress = Address.Address + Byte - InstructionSize;
> InstrMeta.Instruction = Instruction;
> InstrMeta.VMAddress = VMAddress;
> InstrMeta.InstructionSize = InstructionSize;
> @@ -509,8 +513,8 @@ void FileAnalysis::parseSectionContents(
>
> // Check if this instruction exists in the range of the DWARF
> metadata.
> if (!IgnoreDWARFFlag) {
> - auto LineInfo =
> - Symbolizer->symbolizeCode(Object->getFileName(), VMAddress);
> + auto LineInfo = Symbolizer->symbolizeCode(
> + Object->getFileName(), {VMAddress, Address.SectionIndex});
> if (!LineInfo) {
> handleAllErrors(LineInfo.takeError(), [](const ErrorInfoBase &E) {
> errs() << "Symbolizer failed to get line: " << E.message() <<
> "\n";
> @@ -522,7 +526,7 @@ void FileAnalysis::parseSectionContents(
> continue;
> }
>
> - IndirectInstructions.insert(VMAddress);
> + IndirectInstructions.insert({VMAddress, Address.SectionIndex});
> }
> }
>
>
> Modified: llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.h (original)
> +++ llvm/trunk/tools/llvm-cfi-verify/lib/FileAnalysis.h Wed Feb 27
> 05:17:36 2019
> @@ -139,14 +139,15 @@ public:
> bool usesRegisterOperand(const Instr &InstrMeta) const;
>
> // Returns the list of indirect instructions.
> - const std::set<uint64_t> &getIndirectInstructions() const;
> + const std::set<object::SectionedAddress> &getIndirectInstructions()
> const;
>
> const MCRegisterInfo *getRegisterInfo() const;
> const MCInstrInfo *getMCInstrInfo() const;
> const MCInstrAnalysis *getMCInstrAnalysis() const;
>
> // Returns the inlining information for the provided address.
> - Expected<DIInliningInfo> symbolizeInlinedCode(uint64_t Address);
> + Expected<DIInliningInfo>
> + symbolizeInlinedCode(object::SectionedAddress Address);
>
> // Returns whether the provided Graph represents a protected indirect
> control
> // flow instruction in this file.
> @@ -178,7 +179,7 @@ protected:
> // Disassemble and parse the provided bytes into this object.
> Instruction
> // address calculation is done relative to the provided SectionAddress.
> void parseSectionContents(ArrayRef<uint8_t> SectionBytes,
> - uint64_t SectionAddress);
> + object::SectionedAddress Address);
>
> // Constructs and initialises members required for disassembly.
> Error initialiseDisassemblyMembers();
> @@ -225,7 +226,7 @@ private:
> DenseMap<uint64_t, std::vector<uint64_t>> StaticBranchTargetings;
>
> // A list of addresses of indirect control flow instructions.
> - std::set<uint64_t> IndirectInstructions;
> + std::set<object::SectionedAddress> IndirectInstructions;
>
> // The addresses of functions that will trap on CFI violations.
> SmallSet<uint64_t, 4> TrapOnFailFunctionAddresses;
>
> Modified: llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.cpp (original)
> +++ llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.cpp Wed Feb 27
> 05:17:36 2019
> @@ -93,17 +93,19 @@ void GraphResult::printToDOT(const FileA
> }
>
> GraphResult GraphBuilder::buildFlowGraph(const FileAnalysis &Analysis,
> - uint64_t Address) {
> + object::SectionedAddress
> Address) {
> GraphResult Result;
> - Result.BaseAddress = Address;
> + Result.BaseAddress = Address.Address;
> DenseSet<uint64_t> OpenedNodes;
>
> const auto &IndirectInstructions = Analysis.getIndirectInstructions();
>
> - if (IndirectInstructions.find(Address) == IndirectInstructions.end())
> + // check that IndirectInstructions contains specified Address
> + if (IndirectInstructions.find(Address) == IndirectInstructions.end()) {
> return Result;
> + }
>
> - buildFlowGraphImpl(Analysis, OpenedNodes, Result, Address, 0);
> + buildFlowGraphImpl(Analysis, OpenedNodes, Result, Address.Address, 0);
> return Result;
> }
>
>
> Modified: llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.h?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.h (original)
> +++ llvm/trunk/tools/llvm-cfi-verify/lib/GraphBuilder.h Wed Feb 27
> 05:17:36 2019
> @@ -102,7 +102,7 @@ public:
> // (i.e. the upwards traversal did not make it to a branch node) flows
> to the
> // provided node in GraphResult::OrphanedNodes.
> static GraphResult buildFlowGraph(const FileAnalysis &Analysis,
> - uint64_t Address);
> + object::SectionedAddress Address);
>
> private:
> // Implementation function that actually builds the flow graph.
> Retrieves a
>
> Modified: llvm/trunk/tools/llvm-cfi-verify/llvm-cfi-verify.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cfi-verify/llvm-cfi-verify.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-cfi-verify/llvm-cfi-verify.cpp (original)
> +++ llvm/trunk/tools/llvm-cfi-verify/llvm-cfi-verify.cpp Wed Feb 27
> 05:17:36 2019
> @@ -130,8 +130,8 @@ void printIndirectCFInstructions(FileAna
>
> std::map<unsigned, uint64_t> BlameCounter;
>
> - for (uint64_t Address : Analysis.getIndirectInstructions()) {
> - const auto &InstrMeta = Analysis.getInstructionOrDie(Address);
> + for (object::SectionedAddress Address :
> Analysis.getIndirectInstructions()) {
> + const auto &InstrMeta = Analysis.getInstructionOrDie(Address.Address);
> GraphResult Graph = GraphBuilder::buildFlowGraph(Analysis, Address);
>
> CFIProtectionStatus ProtectionStatus =
> @@ -153,7 +153,7 @@ void printIndirectCFInstructions(FileAna
>
> auto InliningInfo = Analysis.symbolizeInlinedCode(Address);
> if (!InliningInfo || InliningInfo->getNumberOfFrames() == 0) {
> - errs() << "Failed to symbolise " << format_hex(Address, 2)
> + errs() << "Failed to symbolise " << format_hex(Address.Address, 2)
> << " with line tables from " << InputFilename << "\n";
> exit(EXIT_FAILURE);
> }
> @@ -164,9 +164,9 @@ void printIndirectCFInstructions(FileAna
> if (!Summarize) {
> for (uint32_t i = 0; i < InliningInfo->getNumberOfFrames(); ++i) {
> const auto &Line = InliningInfo->getFrame(i);
> - outs() << " " << format_hex(Address, 2) << " = " << Line.FileName
> - << ":" << Line.Line << ":" << Line.Column << " ("
> - << Line.FunctionName << ")\n";
> + outs() << " " << format_hex(Address.Address, 2) << " = "
> + << Line.FileName << ":" << Line.Line << ":" << Line.Column
> + << " (" << Line.FunctionName << ")\n";
> }
> }
>
>
> 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=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)
> +++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Wed Feb 27 05:17:36
> 2019
> @@ -379,7 +379,12 @@ static void filterByAccelName(ArrayRef<s
>
> /// Handle the --lookup option and dump the DIEs and line info for the
> given
> /// address.
> -static bool lookup(DWARFContext &DICtx, uint64_t Address, raw_ostream
> &OS) {
> +/// TODO: specified Address for --lookup option could relate for several
> +/// different sections(in case not-linked object file). llvm-dwarfdump
> +/// need to do something with this: extend lookup option with section
> +/// information or probably display all matched entries, or something
> else...
> +static bool lookup(ObjectFile &Obj, DWARFContext &DICtx, uint64_t Address,
> + raw_ostream &OS) {
> auto DIEsForAddr = DICtx.getDIEsForAddress(Lookup);
>
> if (!DIEsForAddr)
> @@ -394,7 +399,10 @@ static bool lookup(DWARFContext &DICtx,
> DIEsForAddr.BlockDIE.dump(OS, 4, DumpOpts);
> }
>
> - if (DILineInfo LineInfo = DICtx.getLineInfoForAddress(Lookup))
> + // TODO: it is neccessary to set proper SectionIndex here.
> + // object::SectionedAddress::UndefSection works for only absolute
> addresses.
> + if (DILineInfo LineInfo = DICtx.getLineInfoForAddress(
> + {Lookup, object::SectionedAddress::UndefSection}))
> LineInfo.dump(OS);
>
> return true;
> @@ -413,7 +421,7 @@ static bool dumpObjectFile(ObjectFile &O
>
> // Handle the --lookup option.
> if (Lookup)
> - return lookup(DICtx, Lookup, OS);
> + return lookup(Obj, DICtx, Lookup, OS);
>
> // Handle the --name option.
> if (!Name.empty()) {
>
> Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
> +++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Wed Feb 27 05:17:36 2019
> @@ -7500,7 +7500,7 @@ static void DisassembleMachO(StringRef F
>
> // Print debug info.
> if (diContext) {
> - DILineInfo dli = diContext->getLineInfoForAddress(PC);
> + DILineInfo dli = diContext->getLineInfoForAddress({PC,
> SectIdx});
> // Print valid line info if it changed.
> if (dli != lastLine && dli.Line != 0)
> outs() << "\t## " << dli.FileName << ':' << dli.Line << ':'
>
> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Wed Feb 27 05:17:36 2019
> @@ -508,7 +508,8 @@ public:
> Symbolizer.reset(new symbolize::LLVMSymbolizer(SymbolizerOpts));
> }
> virtual ~SourcePrinter() = default;
> - virtual void printSourceLine(raw_ostream &OS, uint64_t Address,
> + virtual void printSourceLine(raw_ostream &OS,
> + object::SectionedAddress Address,
> StringRef Delimiter = "; ");
> };
>
> @@ -538,7 +539,8 @@ bool SourcePrinter::cacheSource(const DI
> return true;
> }
>
> -void SourcePrinter::printSourceLine(raw_ostream &OS, uint64_t Address,
> +void SourcePrinter::printSourceLine(raw_ostream &OS,
> + object::SectionedAddress Address,
> StringRef Delimiter) {
> if (!Symbolizer)
> return;
> @@ -599,14 +601,15 @@ class PrettyPrinter {
> public:
> virtual ~PrettyPrinter() = default;
> virtual void printInst(MCInstPrinter &IP, const MCInst *MI,
> - ArrayRef<uint8_t> Bytes, uint64_t Address,
> - raw_ostream &OS, StringRef Annot,
> - MCSubtargetInfo const &STI, SourcePrinter *SP,
> + ArrayRef<uint8_t> Bytes,
> + object::SectionedAddress Address, raw_ostream
> &OS,
> + StringRef Annot, MCSubtargetInfo const &STI,
> + SourcePrinter *SP,
> std::vector<RelocationRef> *Rels = nullptr) {
> if (SP && (PrintSource || PrintLines))
> SP->printSourceLine(OS, Address);
> if (!NoLeadingAddr)
> - OS << format("%8" PRIx64 ":", Address);
> + OS << format("%8" PRIx64 ":", Address.Address);
> if (!NoShowRawInsn) {
> OS << "\t";
> dumpBytes(Bytes, OS);
> @@ -633,13 +636,13 @@ public:
> }
> }
> void printInst(MCInstPrinter &IP, const MCInst *MI, ArrayRef<uint8_t>
> Bytes,
> - uint64_t Address, raw_ostream &OS, StringRef Annot,
> - MCSubtargetInfo const &STI, SourcePrinter *SP,
> + object::SectionedAddress Address, raw_ostream &OS,
> + StringRef Annot, MCSubtargetInfo const &STI,
> SourcePrinter *SP,
> std::vector<RelocationRef> *Rels) override {
> if (SP && (PrintSource || PrintLines))
> SP->printSourceLine(OS, Address, "");
> if (!MI) {
> - printLead(Bytes, Address, OS);
> + printLead(Bytes, Address.Address, OS);
> OS << " <unknown>";
> return;
> }
> @@ -661,9 +664,9 @@ public:
> std::vector<RelocationRef>::const_iterator RelCur = Rels->begin();
> std::vector<RelocationRef>::const_iterator RelEnd = Rels->end();
> auto PrintReloc = [&]() -> void {
> - while ((RelCur != RelEnd) && (RelCur->getOffset() <= Address)) {
> - if (RelCur->getOffset() == Address) {
> - printRelocation(*RelCur, Address, 4);
> + while ((RelCur != RelEnd) && (RelCur->getOffset() <=
> Address.Address)) {
> + if (RelCur->getOffset() == Address.Address) {
> + printRelocation(*RelCur, Address.Address, 4);
> return;
> }
> ++RelCur;
> @@ -675,7 +678,7 @@ public:
> Separator = "\n";
> if (SP && (PrintSource || PrintLines))
> SP->printSourceLine(OS, Address, "");
> - printLead(Bytes, Address, OS);
> + printLead(Bytes, Address.Address, OS);
> OS << Preamble;
> Preamble = " ";
> StringRef Inst;
> @@ -693,7 +696,7 @@ public:
> OS << " } " << PacketBundle.second;
> PrintReloc();
> Bytes = Bytes.slice(4);
> - Address += 4;
> + Address.Address += 4;
> }
> }
> };
> @@ -702,8 +705,8 @@ HexagonPrettyPrinter HexagonPrettyPrinte
> class AMDGCNPrettyPrinter : public PrettyPrinter {
> public:
> void printInst(MCInstPrinter &IP, const MCInst *MI, ArrayRef<uint8_t>
> Bytes,
> - uint64_t Address, raw_ostream &OS, StringRef Annot,
> - MCSubtargetInfo const &STI, SourcePrinter *SP,
> + object::SectionedAddress Address, raw_ostream &OS,
> + StringRef Annot, MCSubtargetInfo const &STI,
> SourcePrinter *SP,
> std::vector<RelocationRef> *Rels) override {
> if (SP && (PrintSource || PrintLines))
> SP->printSourceLine(OS, Address);
> @@ -733,7 +736,7 @@ public:
> }
> }
>
> - OS << format("// %012" PRIX64 ": ", Address);
> + OS << format("// %012" PRIX64 ": ", Address.Address);
> if (Bytes.size() >=4) {
> for (auto D : makeArrayRef(reinterpret_cast<const
> U32*>(Bytes.data()),
> Bytes.size() / sizeof(U32)))
> @@ -754,13 +757,13 @@ AMDGCNPrettyPrinter AMDGCNPrettyPrinterI
> class BPFPrettyPrinter : public PrettyPrinter {
> public:
> void printInst(MCInstPrinter &IP, const MCInst *MI, ArrayRef<uint8_t>
> Bytes,
> - uint64_t Address, raw_ostream &OS, StringRef Annot,
> - MCSubtargetInfo const &STI, SourcePrinter *SP,
> + object::SectionedAddress Address, raw_ostream &OS,
> + StringRef Annot, MCSubtargetInfo const &STI,
> SourcePrinter *SP,
> std::vector<RelocationRef> *Rels) override {
> if (SP && (PrintSource || PrintLines))
> SP->printSourceLine(OS, Address);
> if (!NoLeadingAddr)
> - OS << format("%8" PRId64 ":", Address / 8);
> + OS << format("%8" PRId64 ":", Address.Address / 8);
> if (!NoShowRawInsn) {
> OS << "\t";
> dumpBytes(Bytes, OS);
> @@ -1323,9 +1326,10 @@ static void disassembleObject(const Targ
> if (Size == 0)
> Size = 1;
>
> - PIP.printInst(
> - *IP, Disassembled ? &Inst : nullptr, Bytes.slice(Index, Size),
> - SectionAddr + Index + VMAAdjustment, outs(), "", *STI, &SP,
> &Rels);
> + PIP.printInst(*IP, Disassembled ? &Inst : nullptr,
> + Bytes.slice(Index, Size),
> + {SectionAddr + Index + VMAAdjustment,
> Section.getIndex()},
> + outs(), "", *STI, &SP, &Rels);
> outs() << CommentStream.str();
> Comments.clear();
>
>
> Modified: llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp (original)
> +++ llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp Wed Feb 27 05:17:36 2019
> @@ -367,6 +367,8 @@ static int printLineInfoForInput(bool Lo
> }
> uint64_t Addr = *AddrOrErr;
>
> + object::SectionedAddress Address;
> +
> uint64_t Size = P.second;
> // If we're not using the debug object, compute the address of the
> // symbol in memory (rather than that in the unrelocated object
> file)
> @@ -381,16 +383,20 @@ static int printLineInfoForInput(bool Lo
> object::section_iterator Sec = *SecOrErr;
> StringRef SecName;
> Sec->getName(SecName);
> + Address.SectionIndex = Sec->getIndex();
> uint64_t SectionLoadAddress =
> LoadedObjInfo->getSectionLoadAddress(*Sec);
> if (SectionLoadAddress != 0)
> Addr += SectionLoadAddress - Sec->getAddress();
> - }
> + } else if (auto SecOrErr = Sym.getSection())
> + Address.SectionIndex = SecOrErr.get()->getIndex();
>
> outs() << "Function: " << *Name << ", Size = " << Size
> << ", Addr = " << Addr << "\n";
>
> - DILineInfoTable Lines = Context->getLineInfoForAddressRange(Addr,
> Size);
> + Address.Address = Addr;
> + DILineInfoTable Lines =
> + Context->getLineInfoForAddressRange(Address, Size);
> for (auto &D : Lines) {
> outs() << " Line info @ " << D.first - Addr << ": "
> << D.second.FileName << ", line:" << D.second.Line <<
> "\n";
>
> Modified: llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp (original)
> +++ llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp Wed Feb 27
> 05:17:36 2019
> @@ -194,23 +194,54 @@ static bool parseCommand(StringRef Input
> return !StringRef(pos, offset_length).getAsInteger(0, ModuleOffset);
> }
>
> +// This routine returns section index for an address.
> +// Assumption: would work ambiguously for object files which have
> sections not
> +// assigned to an address(since the same address could belong to various
> +// sections).
> +static uint64_t getModuleSectionIndexForAddress(const std::string
> &ModuleName,
> + uint64_t Address) {
> +
> + Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(ModuleName);
> +
> + if (error(BinaryOrErr))
> + return object::SectionedAddress::UndefSection;
> +
> + Binary &Binary = *BinaryOrErr->getBinary();
> +
> + if (ObjectFile *O = dyn_cast<ObjectFile>(&Binary)) {
> + for (SectionRef Sec : O->sections()) {
> + if (!Sec.isText() || Sec.isVirtual())
> + continue;
> +
> + if (Address >= Sec.getAddress() &&
> + Address <= Sec.getAddress() + Sec.getSize()) {
> + return Sec.getIndex();
> + }
> + }
> + }
> +
> + return object::SectionedAddress::UndefSection;
> +}
> +
> static void symbolizeInput(StringRef InputString, LLVMSymbolizer
> &Symbolizer,
> DIPrinter &Printer) {
> bool IsData = false;
> std::string ModuleName;
> - uint64_t ModuleOffset = 0;
> - if (!parseCommand(StringRef(InputString), IsData, ModuleName,
> ModuleOffset)) {
> + uint64_t Offset = 0;
> + if (!parseCommand(StringRef(InputString), IsData, ModuleName, Offset)) {
> outs() << InputString;
> return;
> }
>
> if (ClPrintAddress) {
> outs() << "0x";
> - outs().write_hex(ModuleOffset);
> + outs().write_hex(Offset);
> StringRef Delimiter = ClPrettyPrint ? ": " : "\n";
> outs() << Delimiter;
> }
> - ModuleOffset -= ClAdjustVMA;
> + Offset -= ClAdjustVMA;
> + object::SectionedAddress ModuleOffset = {
> + Offset, getModuleSectionIndexForAddress(ModuleName, Offset)};
> if (IsData) {
> auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset);
> Printer << (error(ResOrErr) ? DIGlobal() : ResOrErr.get());
>
> Modified: llvm/trunk/tools/llvm-xray/func-id-helper.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-xray/func-id-helper.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-xray/func-id-helper.cpp (original)
> +++ llvm/trunk/tools/llvm-xray/func-id-helper.cpp Wed Feb 27 05:17:36 2019
> @@ -29,7 +29,12 @@ std::string FuncIdConversionHelper::Symb
> return F.str();
> }
>
> - if (auto ResOrErr = Symbolizer.symbolizeCode(BinaryInstrMap,
> It->second)) {
> + object::SectionedAddress ModuleAddress;
> + ModuleAddress.Address = It->second;
> + // TODO: set proper section index here.
> + // object::SectionedAddress::UndefSection works for only absolute
> addresses.
> + ModuleAddress.SectionIndex = object::SectionedAddress::UndefSection;
> + if (auto ResOrErr = Symbolizer.symbolizeCode(BinaryInstrMap,
> ModuleAddress)) {
> auto &DI = *ResOrErr;
> if (DI.FunctionName == "<invalid>")
> F << "@(" << std::hex << It->second << ")";
> @@ -51,7 +56,12 @@ std::string FuncIdConversionHelper::File
> return "(unknown)";
>
> std::ostringstream F;
> - auto ResOrErr = Symbolizer.symbolizeCode(BinaryInstrMap, It->second);
> + object::SectionedAddress ModuleAddress;
> + ModuleAddress.Address = It->second;
> + // TODO: set proper section index here.
> + // object::SectionedAddress::UndefSection works for only absolute
> addresses.
> + ModuleAddress.SectionIndex = object::SectionedAddress::UndefSection;
> + auto ResOrErr = Symbolizer.symbolizeCode(BinaryInstrMap, ModuleAddress);
> if (!ResOrErr) {
> consumeError(ResOrErr.takeError());
> return "(unknown)";
>
> Modified: llvm/trunk/tools/sancov/sancov.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/sancov/sancov.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/sancov/sancov.cpp (original)
> +++ llvm/trunk/tools/sancov/sancov.cpp Wed Feb 27 05:17:36 2019
> @@ -621,10 +621,17 @@ getCoveragePoints(const std::string &Obj
> std::set<std::string> CoveredFiles;
> if (ClSkipDeadFiles) {
> for (auto Addr : CoveredAddrs) {
> - auto LineInfo = Symbolizer->symbolizeCode(ObjectFile, Addr);
> + // TODO: it would be neccessary to set proper section index here.
> + // object::SectionedAddress::UndefSection works for only absolute
> + // addresses.
> + object::SectionedAddress ModuleAddress = {
> + Addr, object::SectionedAddress::UndefSection};
> +
> + auto LineInfo = Symbolizer->symbolizeCode(ObjectFile,
> ModuleAddress);
> failIfError(LineInfo);
> CoveredFiles.insert(LineInfo->FileName);
> - auto InliningInfo = Symbolizer->symbolizeInlinedCode(ObjectFile,
> Addr);
> + auto InliningInfo =
> + Symbolizer->symbolizeInlinedCode(ObjectFile, ModuleAddress);
> failIfError(InliningInfo);
> for (uint32_t I = 0; I < InliningInfo->getNumberOfFrames(); ++I) {
> auto FrameInfo = InliningInfo->getFrame(I);
> @@ -636,7 +643,12 @@ getCoveragePoints(const std::string &Obj
> for (auto Addr : Addrs) {
> std::set<DILineInfo> Infos; // deduplicate debug info.
>
> - auto LineInfo = Symbolizer->symbolizeCode(ObjectFile, Addr);
> + // TODO: it would be neccessary to set proper section index here.
> + // object::SectionedAddress::UndefSection works for only absolute
> addresses.
> + object::SectionedAddress ModuleAddress = {
> + Addr, object::SectionedAddress::UndefSection};
> +
> + auto LineInfo = Symbolizer->symbolizeCode(ObjectFile, ModuleAddress);
> failIfError(LineInfo);
> if (ClSkipDeadFiles &&
> CoveredFiles.find(LineInfo->FileName) == CoveredFiles.end())
> @@ -650,7 +662,8 @@ getCoveragePoints(const std::string &Obj
> Infos.insert(*LineInfo);
> Point.Locs.push_back(*LineInfo);
>
> - auto InliningInfo = Symbolizer->symbolizeInlinedCode(ObjectFile,
> Addr);
> + auto InliningInfo =
> + Symbolizer->symbolizeInlinedCode(ObjectFile, ModuleAddress);
> failIfError(InliningInfo);
> for (uint32_t I = 0; I < InliningInfo->getNumberOfFrames(); ++I) {
> auto FrameInfo = InliningInfo->getFrame(I);
> @@ -957,7 +970,10 @@ symbolize(const RawCoverage &Data, const
> auto Symbolizer(createSymbolizer());
>
> for (uint64_t Addr : *Data.Addrs) {
> - auto LineInfo = Symbolizer->symbolizeCode(ObjectFile, Addr);
> + // TODO: it would be neccessary to set proper section index here.
> + // object::SectionedAddress::UndefSection works for only absolute
> addresses.
> + auto LineInfo = Symbolizer->symbolizeCode(
> + ObjectFile, {Addr, object::SectionedAddress::UndefSection});
> failIfError(LineInfo);
> if (B.isBlacklisted(*LineInfo))
> continue;
>
> Modified: llvm/trunk/tools/sanstats/sanstats.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/sanstats/sanstats.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/sanstats/sanstats.cpp (original)
> +++ llvm/trunk/tools/sanstats/sanstats.cpp Wed Feb 27 05:17:36 2019
> @@ -84,8 +84,10 @@ const char *ReadModule(char SizeofPtr, c
> // As the instrumentation tracks the return address and not
> // the address of the call to `__sanitizer_stat_report` we
> // remove one from the address to get the correct DI.
> - if (Expected<DILineInfo> LineInfo =
> - Symbolizer.symbolizeCode(Filename, Addr - 1)) {
> + // TODO: it would be neccessary to set proper section index here.
> + // object::SectionedAddress::UndefSection works for only absolute
> addresses.
> + if (Expected<DILineInfo> LineInfo = Symbolizer.symbolizeCode(
> + Filename, {Addr - 1,
> object::SectionedAddress::UndefSection})) {
> llvm::outs() << format_hex(Addr - 1, 18) << ' ' <<
> LineInfo->FileName
> << ':' << LineInfo->Line << ' ' <<
> LineInfo->FunctionName
> << ' ';
>
> Modified: llvm/trunk/unittests/tools/llvm-cfi-verify/FileAnalysis.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/tools/llvm-cfi-verify/FileAnalysis.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/tools/llvm-cfi-verify/FileAnalysis.cpp (original)
> +++ llvm/trunk/unittests/tools/llvm-cfi-verify/FileAnalysis.cpp Wed Feb 27
> 05:17:36 2019
> @@ -51,8 +51,8 @@ public:
>
> // Expose this method publicly for testing.
> void parseSectionContents(ArrayRef<uint8_t> SectionBytes,
> - uint64_t SectionAddress) {
> - FileAnalysis::parseSectionContents(SectionBytes, SectionAddress);
> + object::SectionedAddress Address) {
> + FileAnalysis::parseSectionContents(SectionBytes, Address);
> }
>
> Error initialiseDisassemblyMembers() {
> @@ -106,7 +106,7 @@ TEST_F(BasicX86FileAnalysisTest, BasicDi
> 0x41, 0x0e, // 21: rex.B (bad)
> 0x62, 0x72, 0x65, 0x61, 0x6b, // 23: (bad) {%k1}
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
>
> EXPECT_EQ(nullptr, Analysis.getInstruction(0x0));
> EXPECT_EQ(nullptr, Analysis.getInstruction(0x1000));
> @@ -210,7 +210,7 @@ TEST_F(BasicX86FileAnalysisTest, PrevAnd
> 0x2f, // 1: (bad)
> 0x90 // 2: nop
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> const auto &BadInstrMeta = Analysis.getInstructionOrDie(0xDEADBEEF + 1);
> const auto *GoodInstrMeta =
> Analysis.getPrevInstructionSequential(BadInstrMeta);
> @@ -240,7 +240,7 @@ TEST_F(BasicX86FileAnalysisTest, CFITrap
> 0x62, 0x72, 0x65, 0x61, 0x6b, // 23: (bad) {%k1}
> 0x0f, 0x0b // 28: ud2
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
>
>
> EXPECT_FALSE(Analysis.isCFITrap(Analysis.getInstructionOrDie(0xDEADBEEF)));
> EXPECT_FALSE(
> @@ -275,7 +275,7 @@ TEST_F(BasicX86FileAnalysisTest, FallThr
> 0x75, 0x00, // 17: jne +0
> 0xc3, // 19: retq
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
>
> EXPECT_TRUE(
> Analysis.canFallThrough(Analysis.getInstructionOrDie(0xDEADBEEF)));
> @@ -322,7 +322,7 @@ TEST_F(BasicX86FileAnalysisTest, Definit
> 0xeb, 0xdd, // 36: jmp 3 [-35]
> 0xeb, 0xdc, // 38: jmp 4 [-36]
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
>
> const auto *Current = Analysis.getInstruction(0xDEADBEEF);
> const auto *Next = Analysis.getDefiniteNextInstruction(*Current);
> @@ -412,7 +412,7 @@ TEST_F(BasicX86FileAnalysisTest, Control
> 0xeb, 0xdd, // 36: jmp 3 [-35]
> 0xeb, 0xdc, // 38: jmp 4 [-36]
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> const auto *InstrMetaPtr = &Analysis.getInstructionOrDie(0xDEADBEEF);
> std::set<const Instr *> XRefs =
> Analysis.getDirectControlFlowXRefs(*InstrMetaPtr);
> @@ -503,17 +503,18 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x0f, 0x0b, // 1: ud2
> 0x75, 0x00, // 3: jne 5 [+0]
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_NOT_INDIRECT_CF,
> Analysis.validateCFIProtection(Result));
> - Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF + 1);
> + Result = GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 1, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_NOT_INDIRECT_CF,
> Analysis.validateCFIProtection(Result));
> - Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF + 3);
> + Result = GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 3, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_NOT_INDIRECT_CF,
> Analysis.validateCFIProtection(Result));
> - Result = GraphBuilder::buildFlowGraph(Analysis, 0x12345678);
> + Result = GraphBuilder::buildFlowGraph(Analysis, {0x12345678, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_INVALID_INSTRUCTION,
> Analysis.validateCFIProtection(Result));
> }
> @@ -527,8 +528,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x0f, 0x0b, // 2: ud2
> 0xff, 0x10, // 4: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 4);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 4, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -542,8 +544,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0xff, 0x10, // 2: callq *(%rax)
> 0x0f, 0x0b, // 4: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 2);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 2, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -560,8 +563,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x75, 0xf9, // 7: jne 2 [-7]
> 0x0f, 0x0b, // 9: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 3);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 3, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -577,8 +581,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x75, 0xfb, // 5: jne 2 [-5]
> 0x0f, 0x0b, // 7: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 3);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 3, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -596,12 +601,13 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0xff, 0x10, // 6: callq *(%rax)
> 0x0f, 0x0b, // 8: ud2
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> uint64_t PrevSearchLengthForConditionalBranch =
> SearchLengthForConditionalBranch;
> SearchLengthForConditionalBranch = 2;
>
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 6);
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 6, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_ORPHANS,
> Analysis.validateCFIProtection(Result));
>
> @@ -621,11 +627,12 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x90, // 7: nop
> 0x0f, 0x0b, // 8: ud2
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> uint64_t PrevSearchLengthForUndef = SearchLengthForUndef;
> SearchLengthForUndef = 2;
>
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 2);
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 2, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_BAD_CONDITIONAL_BRANCH,
> Analysis.validateCFIProtection(Result));
>
> @@ -642,8 +649,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0xff, 0x10, // 4: callq *(%rax)
> 0x0f, 0x0b, // 6: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 4);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 4, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_ORPHANS,
> Analysis.validateCFIProtection(Result));
> }
> @@ -658,8 +666,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0xff, 0x10, // 4: callq *(%rax)
> 0x0f, 0x0b, // 6: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 4);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 4, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -685,10 +694,11 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x90, // 21: nop
> 0x0f, 0x0b, // 22: ud2
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> uint64_t PrevSearchLengthForUndef = SearchLengthForUndef;
> SearchLengthForUndef = 5;
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 9);
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 9, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_ORPHANS,
> Analysis.validateCFIProtection(Result));
> SearchLengthForUndef = PrevSearchLengthForUndef;
> @@ -704,10 +714,10 @@ TEST_F(BasicX86FileAnalysisTest, UndefSe
> 0xe8, 0x09, 0x00, 0x00, 0x00, // 0x688122: callq 0x688130
> 0x0f, 0x0b, // 0x688127: ud2
> },
> - 0x688118);
> + {0x688118, 0x0});
> uint64_t PrevSearchLengthForUndef = SearchLengthForUndef;
> SearchLengthForUndef = 1;
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0x68811d);
> + GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, {0x68811d,
> 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> SearchLengthForUndef = PrevSearchLengthForUndef;
> @@ -719,7 +729,7 @@ TEST_F(BasicX86FileAnalysisTest, UndefSe
> 0x74, 0x73, // 0x7759eb: je 0x775a60
> 0xe9, 0x1c, 0x04, 0x00, 0x00, 0x00, // 0x7759ed: jmpq 0x775e0e
> },
> - 0x7759eb);
> + {0x7759eb, 0x0});
>
> Analysis.parseSectionContents(
> {
> @@ -729,24 +739,24 @@ TEST_F(BasicX86FileAnalysisTest, UndefSe
> 0x48, 0x89, 0xde, // 0x775a65: mov %rbx,%rsi
> 0xff, 0xd1, // 0x775a68: callq *%rcx
> },
> - 0x775a56);
> + {0x775a56, 0x0});
>
> Analysis.parseSectionContents(
> {
> 0x0f, 0x0b, // 0x775e0e: ud2
> },
> - 0x775e0e);
> + {0x775e0e, 0x0});
> uint64_t PrevSearchLengthForUndef = SearchLengthForUndef;
> SearchLengthForUndef = 1;
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0x775a68);
> + GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, {0x775a68,
> 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_BAD_CONDITIONAL_BRANCH,
> Analysis.validateCFIProtection(Result));
> SearchLengthForUndef = 2;
> - Result = GraphBuilder::buildFlowGraph(Analysis, 0x775a68);
> + Result = GraphBuilder::buildFlowGraph(Analysis, {0x775a68, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> SearchLengthForUndef = 3;
> - Result = GraphBuilder::buildFlowGraph(Analysis, 0x775a68);
> + Result = GraphBuilder::buildFlowGraph(Analysis, {0x775a68, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> SearchLengthForUndef = PrevSearchLengthForUndef;
> @@ -762,8 +772,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x48, 0x05, 0x00, 0x00, 0x00, 0x00, // 4: add $0x0, %rax
> 0xff, 0x10, // 10: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 10);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 10, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -778,8 +789,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x48, 0x83, 0xc0, 0x00, // 4: add $0x0, %rax
> 0xff, 0x10, // 8: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 8);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 8, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -794,8 +806,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x05, 0x00, 0x00, 0x00, 0x00, // 4: add $0x0, %eax
> 0xff, 0x10, // 9: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 9);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 9, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -812,8 +825,9 @@ TEST_F(BasicX86FileAnalysisTest, CFIProt
> 0x75, 0xf9, // 8: jne 2 [-7]
> 0x0f, 0x0b, // 10: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 4);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 4, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -825,8 +839,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> {
> 0x00, 0x01, 0x3f, 0xd6, // 0: blr x8
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_ORPHANS,
> Analysis.validateCFIProtection(Result));
> }
> @@ -840,8 +855,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x20, 0x00, 0x20, 0xd4, // 4: brk #0x1
> 0x00, 0x01, 0x3f, 0xd6, // 8: blr x8
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 8);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 8, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -856,8 +872,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x08, 0x05, 0x00, 0x91, // 8: add x8, x8, #1
> 0x00, 0x01, 0x3f, 0xd6, // 12: blr x8
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 12);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 12, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -872,8 +889,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x21, 0x09, 0x40, 0xf9, // 8: ldr x1, [x9,#16]
> 0x20, 0x00, 0x1f, 0xd6, // 12: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 12);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 12, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -889,8 +907,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x21, 0x09, 0x40, 0xf9, // 12: ldr x1, [x9,#16]
> 0x20, 0x00, 0x1f, 0xd6, // 16: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 16);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 16, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -906,8 +925,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x21, 0x04, 0x00, 0x91, // 12: add x1, x1, #1
> 0x20, 0x00, 0x1f, 0xd6, // 16: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 16);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 16, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -923,8 +943,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x21, 0x09, 0x40, 0xf9, // 12: ldr x1, [x9,#16]
> 0x20, 0x00, 0x1f, 0xd6, // 16: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 16);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 16, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -940,8 +961,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x21, 0x08, 0x40, 0xf9, // 12: ldr x1, [x1,#16]
> 0x20, 0x00, 0x1f, 0xd6, // 16: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 16);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 16, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -957,8 +979,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x21, 0x09, 0x40, 0xf9, // 12: ldr x1, [x9,#16]
> 0x20, 0x00, 0x1f, 0xd6, // 16: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 16);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 16, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -974,8 +997,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x22, 0x08, 0x40, 0xf9, // 12: ldr x2, [x1,#16]
> 0x20, 0x00, 0x1f, 0xd6, // 16: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 16);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 16, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -990,8 +1014,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x20, 0x00, 0x20, 0xd4, // 8: brk #0x1
> 0x20, 0x00, 0x1f, 0xd6, // 12: br x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 12);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 12, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_ORPHANS,
> Analysis.validateCFIProtection(Result));
> }
> @@ -1009,8 +1034,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x20, 0x00, 0x1f, 0xd6, // 20: br x1
> 0x20, 0x00, 0x20, 0xd4, // 24: brk #0x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 20);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 20, 0x0});
> EXPECT_EQ(CFIProtectionStatus::PROTECTED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -1029,8 +1055,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x20, 0x00, 0x1f, 0xd6, // 24: br x1
> 0x20, 0x00, 0x20, 0xd4, // 28: brk #0x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 24);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 24, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
> @@ -1049,8 +1076,9 @@ TEST_F(BasicAArch64FileAnalysisTest, AAr
> 0x20, 0x00, 0x1f, 0xd6, // 24: br x1
> 0x20, 0x00, 0x20, 0xd4, // 28: brk #0x1
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 24);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 24, 0x0});
> EXPECT_EQ(CFIProtectionStatus::FAIL_REGISTER_CLOBBERED,
> Analysis.validateCFIProtection(Result));
> }
>
> Modified: llvm/trunk/unittests/tools/llvm-cfi-verify/GraphBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/tools/llvm-cfi-verify/GraphBuilder.cpp?rev=354972&r1=354971&r2=354972&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/tools/llvm-cfi-verify/GraphBuilder.cpp (original)
> +++ llvm/trunk/unittests/tools/llvm-cfi-verify/GraphBuilder.cpp Wed Feb 27
> 05:17:36 2019
> @@ -113,8 +113,8 @@ public:
>
> // Expose this method publicly for testing.
> void parseSectionContents(ArrayRef<uint8_t> SectionBytes,
> - uint64_t SectionAddress) {
> - FileAnalysis::parseSectionContents(SectionBytes, SectionAddress);
> + object::SectionedAddress Address) {
> + FileAnalysis::parseSectionContents(SectionBytes, Address);
> }
>
> Error initialiseDisassemblyMembers() {
> @@ -156,8 +156,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x0f, 0x0b, // 2: ud2
> 0xff, 0x10, // 4: callq *(%rax)
> },
> - 0xDEADBEEF);
> - const auto Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF +
> 4);
> + {0xDEADBEEF, 0x0});
> + const auto Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 4, 0x0});
>
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(1));
> @@ -182,8 +183,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0xff, 0x10, // 2: callq *(%rax)
> 0x0f, 0x0b, // 4: ud2
> },
> - 0xDEADBEEF);
> - const auto Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF +
> 2);
> + {0xDEADBEEF, 0x0});
> + const auto Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 2, 0x0});
>
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(1));
> @@ -211,8 +213,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x75, 0xf9, // 7: jne 2 [-7]
> 0x0f, 0x0b, // 9: ud2
> },
> - 0xDEADBEEF);
> - const auto Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF +
> 3);
> + {0xDEADBEEF, 0x0});
> + const auto Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 3, 0x0});
>
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(2));
> @@ -249,8 +252,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x75, 0xfb, // 5: jne 2 [-5]
> 0x0f, 0x0b, // 7: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 3);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 3, 0x0});
>
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(2));
> @@ -284,16 +288,17 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x90, // 0: nop
> 0x75, 0xfe, // 1: jne 1 [-2]
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, IsEmpty());
>
> - Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF + 1);
> + Result = GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 1, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, IsEmpty());
>
> - Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADC0DE);
> + Result = GraphBuilder::buildFlowGraph(Analysis, {0xDEADC0DE, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, IsEmpty());
> }
> @@ -306,8 +311,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0xeb, 0xfe, // 0: jmp 0 [-2]
> 0xff, 0x10, // 2: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 2);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 2, 0x0});
> EXPECT_THAT(Result.ConditionalBranchNodes, IsEmpty());
> EXPECT_THAT(Result.OrphanedNodes, ElementsAre(0xDEADBEEF + 2));
> EXPECT_THAT(Result.IntermediateNodes, IsEmpty());
> @@ -321,8 +327,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x75, 0xfe, // 0: jne 0 [-2]
> 0xff, 0x10, // 2: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 2);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 2, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(1));
> EXPECT_THAT(
> @@ -344,8 +351,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0xeb, 0xfc, // 2: jmp 0 [-4]
> 0xff, 0x10, // 4: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 4);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 4, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(1));
> EXPECT_THAT(
> @@ -368,8 +376,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0xeb, 0xfc, // 2: jmp 0 [-4]
> 0xff, 0x10, // 4: callq *(%rax)
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 4);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 4, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, ElementsAre(0xDEADBEEF + 4));
> EXPECT_THAT(Result.ConditionalBranchNodes, IsEmpty());
> }
> @@ -387,12 +396,13 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0xff, 0x10, // 6: callq *(%rax)
> 0x0f, 0x0b, // 8: ud2
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> uint64_t PrevSearchLengthForConditionalBranch =
> SearchLengthForConditionalBranch;
> SearchLengthForConditionalBranch = 2;
>
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 6);
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 6, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, SizeIs(1));
> EXPECT_THAT(Result.OrphanedNodes,
> Each(HasPath(Result, ElementsAre(0xDEADBEEF + 4, 0xDEADBEEF
> + 5,
> @@ -416,11 +426,12 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x90, // 7: nop
> 0x0f, 0x0b, // 8: ud2
> },
> - 0xDEADBEEF);
> + {0xDEADBEEF, 0x0});
> uint64_t PrevSearchLengthForUndef = SearchLengthForUndef;
> SearchLengthForUndef = 2;
>
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 2);
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 2, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(
> Result.ConditionalBranchNodes,
> @@ -450,8 +461,9 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x75, 0xfb, // 5: jne 2 [-5]
> 0x0f, 0x0b, // 7: ud2
> },
> - 0xDEADBEEF);
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0xDEADBEEF
> + 3);
> + {0xDEADBEEF, 0x0});
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0xDEADBEEF + 3, 0x0});
> EXPECT_THAT(Result.OrphanedNodes, IsEmpty());
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(2));
> EXPECT_THAT(
> @@ -529,11 +541,12 @@ TEST_F(BasicGraphBuilderTest, BuildFlowG
> 0x90, // 21: nop
> 0x0f, 0x0b, // 22: ud2
> },
> - 0x1000);
> + {0x1000, 0x0});
> uint64_t PrevSearchLengthForUndef = SearchLengthForUndef;
> SearchLengthForUndef = 5;
>
> - GraphResult Result = GraphBuilder::buildFlowGraph(Analysis, 0x1000 + 9);
> + GraphResult Result =
> + GraphBuilder::buildFlowGraph(Analysis, {0x1000 + 9, 0x0});
>
> EXPECT_THAT(Result.OrphanedNodes, SizeIs(1));
> EXPECT_THAT(Result.ConditionalBranchNodes, SizeIs(3));
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> <http://e.mail.ru/compose/?mailto=mailto%3allvm%2dcommits@lists.llvm.org>
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
>
> --
> Alexey Lapshin
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190227/64805703/attachment-0001.html>
More information about the llvm-commits
mailing list