[llvm] 5bf2ef9 - Revert "[llvm-readobj] [ARMWinEH] Fix handling of relocations and symbol offsets"

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 29 14:06:23 PDT 2021


Author: Martin Storsjö
Date: 2021-04-30T00:06:16+03:00
New Revision: 5bf2ef9d869ba882480232a4ed87728af74dac3b

URL: https://github.com/llvm/llvm-project/commit/5bf2ef9d869ba882480232a4ed87728af74dac3b
DIFF: https://github.com/llvm/llvm-project/commit/5bf2ef9d869ba882480232a4ed87728af74dac3b.diff

LOG: Revert "[llvm-readobj] [ARMWinEH] Fix handling of relocations and symbol offsets"

This reverts commit 37789240882bfacd951767acdb4c088fcbf53385.

The added test fails on at least one buildbot, by printing a reversed
combination, printing "func3_xdata +0x18 (0x8)" while it's supposed to
be "func3_xdata +0x8 (0x18)", see e.g.
https://lab.llvm.org/buildbot/#/builders/107/builds/7269. Currently
no idea how that could happen, but reverting until it can be figured
out.

Added: 
    

Modified: 
    llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp
    llvm/tools/llvm-readobj/ARMWinEHPrinter.h

Removed: 
    llvm/test/tools/llvm-readobj/COFF/arm64-packed-symbol-name.yaml
    llvm/test/tools/llvm-readobj/COFF/arm64-unwind-reference.yaml


################################################################################
diff  --git a/llvm/test/tools/llvm-readobj/COFF/arm64-packed-symbol-name.yaml b/llvm/test/tools/llvm-readobj/COFF/arm64-packed-symbol-name.yaml
deleted file mode 100644
index af2bd8aa9a097..0000000000000
--- a/llvm/test/tools/llvm-readobj/COFF/arm64-packed-symbol-name.yaml
+++ /dev/null
@@ -1,59 +0,0 @@
-# Check that we resolve the function name properly
-
-# RUN: yaml2obj %s -o %t.obj
-# RUN: llvm-readobj --unwind %t.obj | FileCheck %s
-
-# CHECK: Function: entry (0x140001000)
-
---- !COFF
-OptionalHeader:
-  AddressOfEntryPoint: 4096
-  ImageBase:       5368709120
-  SectionAlignment: 4096
-  FileAlignment:   512
-  MajorOperatingSystemVersion: 6
-  MinorOperatingSystemVersion: 0
-  MajorImageVersion: 0
-  MinorImageVersion: 0
-  MajorSubsystemVersion: 6
-  MinorSubsystemVersion: 0
-  Subsystem:       IMAGE_SUBSYSTEM_WINDOWS_CUI
-  DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
-  SizeOfStackReserve: 1048576
-  SizeOfStackCommit: 4096
-  SizeOfHeapReserve: 1048576
-  SizeOfHeapCommit: 4096
-header:
-  Machine:         IMAGE_FILE_MACHINE_ARM64
-  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ]
-sections:
-  - Name:            .text
-    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
-    VirtualAddress:  4096
-    VirtualSize:     20
-    SectionData:     FD7BBFA9FD0300911F2003D5FD7BC1A8C0035FD6
-  - Name:            .pdata
-    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
-    VirtualAddress:  8192
-    VirtualSize:     8
-    SectionData:     '001000001500E000'
-symbols:
-  - Name:            .text
-    Value:           0
-    SectionNumber:   1
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-  - Name:            .pdata
-    Value:           0
-    SectionNumber:   2
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-  - Name:            entry
-    Value:           0
-    SectionNumber:   1
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
-    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
-...

diff  --git a/llvm/test/tools/llvm-readobj/COFF/arm64-unwind-reference.yaml b/llvm/test/tools/llvm-readobj/COFF/arm64-unwind-reference.yaml
deleted file mode 100644
index 80a9dfa739436..0000000000000
--- a/llvm/test/tools/llvm-readobj/COFF/arm64-unwind-reference.yaml
+++ /dev/null
@@ -1,196 +0,0 @@
-# Test reading an ExceptionRecord which is referenced in 
diff erent ways:
-# - Relocation against base of .xdata record, immediate offset in .pdata
-#   (what LLVM produces)
-# - Relocation against symbol in .xdata, no immediate offset in .pdata
-#   (what MSVC produces)
-# - Combination of the two above (unlikely to occur in the wild, but for
-#   testing the consistency of the code)
-
-# RUN: yaml2obj %s -o %t.obj
-# RUN: llvm-readobj --unwind %t.obj | FileCheck %s
-
-# CHECK:      UnwindInformation [
-# CHECK-NEXT:   RuntimeFunction {
-# CHECK-NEXT:     Function: func (0x0)
-# CHECK-NEXT:     ExceptionRecord: .xdata (0x0)
-# CHECK-NEXT:     ExceptionData {
-# CHECK-NEXT:       FunctionLength: 4
-# CHECK-NEXT:       Version: 0
-# CHECK-NEXT:       ExceptionData: No
-# CHECK-NEXT:       EpiloguePacked: No
-# CHECK-NEXT:       EpilogueScopes: 0
-# CHECK-NEXT:       ByteCodeLength: 4
-# CHECK-NEXT:       Prologue [
-# CHECK-NEXT:         0xd400              ; str x19, [sp, #-8]!
-# CHECK-NEXT:         0xe4                ; end
-# CHECK-NEXT:       ]
-# CHECK-NEXT:       EpilogueScopes [
-# CHECK-NEXT:       ]
-# CHECK-NEXT:     }
-# CHECK-NEXT:   }
-# CHECK-NEXT:   RuntimeFunction {
-# CHECK-NEXT:     Function: func2 (0x4)
-# CHECK-NEXT:     ExceptionRecord: .xdata +0x8 (0x8)
-# CHECK-NEXT:     ExceptionData {
-# CHECK-NEXT:       FunctionLength: 4
-# CHECK-NEXT:       Version: 0
-# CHECK-NEXT:       ExceptionData: No
-# CHECK-NEXT:       EpiloguePacked: No
-# CHECK-NEXT:       EpilogueScopes: 0
-# CHECK-NEXT:       ByteCodeLength: 4
-# CHECK-NEXT:       Prologue [
-# CHECK-NEXT:         0xdc01              ; str d8, [sp, #8]
-# CHECK-NEXT:         0xe4                ; end
-# CHECK-NEXT:       ]
-# CHECK-NEXT:       EpilogueScopes [
-# CHECK-NEXT:       ]
-# CHECK-NEXT:     }
-# CHECK-NEXT:   }
-# CHECK-NEXT:   RuntimeFunction {
-# CHECK-NEXT:     Function: func3 (0x8)
-# CHECK-NEXT:     ExceptionRecord: func3_xdata (0x10)
-# CHECK-NEXT:     ExceptionData {
-# CHECK-NEXT:       FunctionLength: 4
-# CHECK-NEXT:       Version: 0
-# CHECK-NEXT:       ExceptionData: No
-# CHECK-NEXT:       EpiloguePacked: No
-# CHECK-NEXT:       EpilogueScopes: 0
-# CHECK-NEXT:       ByteCodeLength: 4
-# CHECK-NEXT:       Prologue [
-# CHECK-NEXT:         0xe1                ; mov fp, sp
-# CHECK-NEXT:         0xe4                ; end
-# CHECK-NEXT:       ]
-# CHECK-NEXT:       EpilogueScopes [
-# CHECK-NEXT:       ]
-# CHECK-NEXT:     }
-# CHECK-NEXT:   }
-# CHECK-NEXT:   RuntimeFunction {
-# CHECK-NEXT:     Function: func4 (0xC)
-# CHECK-NEXT:     ExceptionRecord: func3_xdata +0x8 (0x18)
-# CHECK-NEXT:     ExceptionData {
-# CHECK-NEXT:       FunctionLength: 4
-# CHECK-NEXT:       Version: 0
-# CHECK-NEXT:       ExceptionData: No
-# CHECK-NEXT:       EpiloguePacked: No
-# CHECK-NEXT:       EpilogueScopes: 0
-# CHECK-NEXT:       ByteCodeLength: 4
-# CHECK-NEXT:       Prologue [
-# CHECK-NEXT:         0x81                ; stp x29, x30, [sp, #-16]!
-# CHECK-NEXT:         0xe4                ; end
-# CHECK-NEXT:       ]
-# CHECK-NEXT:       EpilogueScopes [
-# CHECK-NEXT:       ]
-# CHECK-NEXT:     }
-# CHECK-NEXT:   }
-# CHECK-NEXT: ]
-
---- !COFF
-header:
-  Machine:         IMAGE_FILE_MACHINE_ARM64
-  Characteristics: [  ]
-sections:
-  - Name:            .text
-    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
-    Alignment:       4
-    SectionData:     F38F1FF8E80700FDFD030091FD7BBFA9
-  - Name:            .xdata
-    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
-    Alignment:       4
-    SectionData:     01000008D400E4E301000008DC01E4E301000008E1E4E3E30100000881E4E3E3
-  - Name:            .pdata
-    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
-    Alignment:       4
-    SectionData:     '0000000000000000000000000800000000000000000000000000000008000000'
-    Relocations:
-      - VirtualAddress:  0
-        SymbolName:      func
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-      - VirtualAddress:  4
-        SymbolName:      .xdata
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-      - VirtualAddress:  8
-        SymbolName:      func2
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-      - VirtualAddress:  12
-        SymbolName:      .xdata
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-      - VirtualAddress:  16
-        SymbolName:      func3
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-      - VirtualAddress:  20
-        SymbolName:      func3_xdata
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-      - VirtualAddress:  24
-        SymbolName:      func4
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-      - VirtualAddress:  28
-        SymbolName:      func3_xdata
-        Type:            IMAGE_REL_ARM64_ADDR32NB
-symbols:
-  - Name:            .text
-    Value:           0
-    SectionNumber:   1
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-    SectionDefinition:
-      Length:          16
-      NumberOfRelocations: 0
-      NumberOfLinenumbers: 0
-      CheckSum:        2581817939
-      Number:          1
-  - Name:            .xdata
-    Value:           0
-    SectionNumber:   2
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-    SectionDefinition:
-      Length:          32
-      NumberOfRelocations: 0
-      NumberOfLinenumbers: 0
-      CheckSum:        3086971960
-      Number:          2
-  - Name:            .pdata
-    Value:           0
-    SectionNumber:   3
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-    SectionDefinition:
-      Length:          32
-      NumberOfRelocations: 8
-      NumberOfLinenumbers: 0
-      CheckSum:        0
-      Number:          3
-  - Name:            func
-    Value:           0
-    SectionNumber:   1
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-  - Name:            func2
-    Value:           4
-    SectionNumber:   1
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-  - Name:            func3
-    Value:           8
-    SectionNumber:   1
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-  - Name:            func4
-    Value:           12
-    SectionNumber:   1
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-  - Name:            func3_xdata
-    Value:           16
-    SectionNumber:   2
-    SimpleType:      IMAGE_SYM_TYPE_NULL
-    ComplexType:     IMAGE_SYM_DTYPE_NULL
-    StorageClass:    IMAGE_SYM_CLASS_STATIC
-...

diff  --git a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp b/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp
index aa126ebed08d1..3491ea464b5ec 100644
--- a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp
+++ b/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp
@@ -238,41 +238,6 @@ ErrorOr<SymbolRef> Decoder::getRelocatedSymbol(const COFFObjectFile &,
   return inconvertibleErrorCode();
 }
 
-ErrorOr<SymbolRef> Decoder::getSymbolForLocation(
-    const COFFObjectFile &COFF, const SectionRef &Section,
-    uint64_t OffsetInSection, uint64_t ImmediateOffset, uint64_t &SymbolAddress,
-    uint64_t &SymbolOffset, bool FunctionOnly) {
-  // Try to locate a relocation that points at the offset in the section
-  ErrorOr<SymbolRef> SymOrErr =
-      getRelocatedSymbol(COFF, Section, OffsetInSection);
-  if (SymOrErr) {
-    // We found a relocation symbol; the immediate offset needs to be added
-    // to the symbol address.
-    SymbolOffset = ImmediateOffset;
-
-    Expected<uint64_t> AddressOrErr = SymOrErr->getAddress();
-    if (!AddressOrErr) {
-      std::string Buf;
-      llvm::raw_string_ostream OS(Buf);
-      logAllUnhandledErrors(AddressOrErr.takeError(), OS);
-      OS.flush();
-      report_fatal_error(Buf);
-    }
-    // We apply SymbolOffset here directly. We return it separately to allow
-    // the caller to print it as an offset on the symbol name.
-    SymbolAddress = *AddressOrErr + SymbolOffset;
-  } else {
-    // No matching relocation found; operating on a linked image. Try to
-    // find a descriptive symbol if possible. The immediate offset contains
-    // the image relative address, and we shouldn't add any offset to the
-    // symbol.
-    SymbolAddress = COFF.getImageBase() + ImmediateOffset;
-    SymbolOffset = 0;
-    SymOrErr = getSymbol(COFF, SymbolAddress, FunctionOnly);
-  }
-  return SymOrErr;
-}
-
 bool Decoder::opcode_0xxxxxxx(const uint8_t *OC, unsigned &Offset,
                               unsigned Length, bool Prologue) {
   uint8_t Imm = OC[Offset] & 0x7f;
@@ -954,16 +919,16 @@ bool Decoder::dumpXDataRecord(const COFFObjectFile &COFF,
   }
 
   if (XData.X()) {
+    const uint64_t Address = COFF.getImageBase() + XData.ExceptionHandlerRVA();
     const uint32_t Parameter = XData.ExceptionHandlerParameter();
-    const size_t HandlerOffset = HeaderWords(XData) +
-                                 (XData.E() ? 0 : XData.EpilogueCount()) +
-                                 XData.CodeWords();
-
-    uint64_t Address, SymbolOffset;
-    ErrorOr<SymbolRef> Symbol = getSymbolForLocation(
-        COFF, Section, Offset + HandlerOffset * sizeof(uint32_t),
-        XData.ExceptionHandlerRVA(), Address, SymbolOffset,
-        /*FunctionOnly=*/true);
+    const size_t HandlerOffset = HeaderWords(XData)
+                               + (XData.E() ? 0 : XData.EpilogueCount())
+                               + XData.CodeWords();
+
+    ErrorOr<SymbolRef> Symbol = getRelocatedSymbol(
+        COFF, Section, Offset + HandlerOffset * sizeof(uint32_t));
+    if (!Symbol)
+      Symbol = getSymbol(COFF, Address, /*FunctionOnly=*/true);
     if (!Symbol) {
       ListScope EHS(SW, "ExceptionHandler");
       SW.printHex("Routine", Address);
@@ -981,7 +946,7 @@ bool Decoder::dumpXDataRecord(const COFFObjectFile &COFF,
     }
 
     ListScope EHS(SW, "ExceptionHandler");
-    SW.printString("Routine", formatSymbol(*Name, Address, SymbolOffset));
+    SW.printString("Routine", formatSymbol(*Name, Address));
     SW.printHex("Parameter", Parameter);
   }
 
@@ -994,15 +959,14 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF,
   assert(RF.Flag() == RuntimeFunctionFlag::RFF_Unpacked &&
          "packed entry cannot be treated as an unpacked entry");
 
-  uint64_t FunctionAddress, FunctionOffset;
-  ErrorOr<SymbolRef> Function = getSymbolForLocation(
-      COFF, Section, Offset, RF.BeginAddress, FunctionAddress, FunctionOffset,
-      /*FunctionOnly=*/true);
+  ErrorOr<SymbolRef> Function = getRelocatedSymbol(COFF, Section, Offset);
+  if (!Function)
+    Function = getSymbol(COFF, COFF.getImageBase() + RF.BeginAddress,
+                         /*FunctionOnly=*/true);
 
-  uint64_t XDataAddress, XDataOffset;
-  ErrorOr<SymbolRef> XDataRecord = getSymbolForLocation(
-      COFF, Section, Offset + 4, RF.ExceptionInformationRVA(), XDataAddress,
-      XDataOffset);
+  ErrorOr<SymbolRef> XDataRecord = getRelocatedSymbol(COFF, Section, Offset + 4);
+  if (!XDataRecord)
+    XDataRecord = getSymbol(COFF, RF.ExceptionInformationRVA());
 
   if (!RF.BeginAddress && !Function)
     return false;
@@ -1010,6 +974,7 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF,
     return false;
 
   StringRef FunctionName;
+  uint64_t FunctionAddress;
   if (Function) {
     Expected<StringRef> FunctionNameOrErr = Function->getName();
     if (!FunctionNameOrErr) {
@@ -1020,10 +985,20 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF,
       report_fatal_error(Buf);
     }
     FunctionName = *FunctionNameOrErr;
+    Expected<uint64_t> FunctionAddressOrErr = Function->getAddress();
+    if (!FunctionAddressOrErr) {
+      std::string Buf;
+      llvm::raw_string_ostream OS(Buf);
+      logAllUnhandledErrors(FunctionAddressOrErr.takeError(), OS);
+      OS.flush();
+      report_fatal_error(Buf);
+    }
+    FunctionAddress = *FunctionAddressOrErr;
+  } else {
+    FunctionAddress = COFF.getImageBase() + RF.BeginAddress;
   }
 
-  SW.printString("Function",
-                 formatSymbol(FunctionName, FunctionAddress, FunctionOffset));
+  SW.printString("Function", formatSymbol(FunctionName, FunctionAddress));
 
   if (XDataRecord) {
     Expected<StringRef> Name = XDataRecord->getName();
@@ -1035,8 +1010,17 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF,
       report_fatal_error(Buf);
     }
 
-    SW.printString("ExceptionRecord",
-                   formatSymbol(*Name, XDataAddress, XDataOffset));
+    Expected<uint64_t> AddressOrErr = XDataRecord->getAddress();
+    if (!AddressOrErr) {
+      std::string Buf;
+      llvm::raw_string_ostream OS(Buf);
+      logAllUnhandledErrors(AddressOrErr.takeError(), OS);
+      OS.flush();
+      report_fatal_error(Buf);
+    }
+    uint64_t Address = *AddressOrErr;
+
+    SW.printString("ExceptionRecord", formatSymbol(*Name, Address));
 
     Expected<section_iterator> SIOrErr = XDataRecord->getSection();
     if (!SIOrErr) {
@@ -1046,15 +1030,18 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF,
     }
     section_iterator SI = *SIOrErr;
 
-    return dumpXDataRecord(COFF, *SI, FunctionAddress, XDataAddress);
+    // FIXME: Do we need to add an offset from the relocation?
+    return dumpXDataRecord(COFF, *SI, FunctionAddress,
+                           RF.ExceptionInformationRVA());
   } else {
-    SW.printString("ExceptionRecord", formatSymbol("", XDataAddress));
+    uint64_t Address = COFF.getImageBase() + RF.ExceptionInformationRVA();
+    SW.printString("ExceptionRecord", formatSymbol("", Address));
 
-    ErrorOr<SectionRef> Section = getSectionContaining(COFF, XDataAddress);
+    ErrorOr<SectionRef> Section = getSectionContaining(COFF, Address);
     if (!Section)
       return false;
 
-    return dumpXDataRecord(COFF, *Section, FunctionAddress, XDataAddress);
+    return dumpXDataRecord(COFF, *Section, FunctionAddress, Address);
   }
 }
 
@@ -1065,12 +1052,12 @@ bool Decoder::dumpPackedEntry(const object::COFFObjectFile &COFF,
           RF.Flag() == RuntimeFunctionFlag::RFF_PackedFragment) &&
          "unpacked entry cannot be treated as a packed entry");
 
-  uint64_t FunctionAddress, FunctionOffset;
-  ErrorOr<SymbolRef> Function = getSymbolForLocation(
-      COFF, Section, Offset, RF.BeginAddress, FunctionAddress, FunctionOffset,
-      /*FunctionOnly=*/true);
+  ErrorOr<SymbolRef> Function = getRelocatedSymbol(COFF, Section, Offset);
+  if (!Function)
+    Function = getSymbol(COFF, RF.BeginAddress, /*FunctionOnly=*/true);
 
   StringRef FunctionName;
+  uint64_t FunctionAddress;
   if (Function) {
     Expected<StringRef> FunctionNameOrErr = Function->getName();
     if (!FunctionNameOrErr) {
@@ -1081,10 +1068,20 @@ bool Decoder::dumpPackedEntry(const object::COFFObjectFile &COFF,
       report_fatal_error(Buf);
     }
     FunctionName = *FunctionNameOrErr;
+    Expected<uint64_t> FunctionAddressOrErr = Function->getAddress();
+    if (!FunctionAddressOrErr) {
+      std::string Buf;
+      llvm::raw_string_ostream OS(Buf);
+      logAllUnhandledErrors(FunctionAddressOrErr.takeError(), OS);
+      OS.flush();
+      report_fatal_error(Buf);
+    }
+    FunctionAddress = *FunctionAddressOrErr;
+  } else {
+    FunctionAddress = COFF.getPE32Header()->ImageBase + RF.BeginAddress;
   }
 
-  SW.printString("Function",
-                 formatSymbol(FunctionName, FunctionAddress, FunctionOffset));
+  SW.printString("Function", formatSymbol(FunctionName, FunctionAddress));
   if (!isAArch64)
     SW.printBoolean("Fragment",
                     RF.Flag() == RuntimeFunctionFlag::RFF_PackedFragment);
@@ -1107,12 +1104,12 @@ bool Decoder::dumpPackedARM64Entry(const object::COFFObjectFile &COFF,
           RF.Flag() == RuntimeFunctionFlag::RFF_PackedFragment) &&
          "unpacked entry cannot be treated as a packed entry");
 
-  uint64_t FunctionAddress, FunctionOffset;
-  ErrorOr<SymbolRef> Function = getSymbolForLocation(
-      COFF, Section, Offset, RF.BeginAddress, FunctionAddress, FunctionOffset,
-      /*FunctionOnly=*/true);
+  ErrorOr<SymbolRef> Function = getRelocatedSymbol(COFF, Section, Offset);
+  if (!Function)
+    Function = getSymbol(COFF, RF.BeginAddress, /*FunctionOnly=*/true);
 
   StringRef FunctionName;
+  uint64_t FunctionAddress;
   if (Function) {
     Expected<StringRef> FunctionNameOrErr = Function->getName();
     if (!FunctionNameOrErr) {
@@ -1123,10 +1120,20 @@ bool Decoder::dumpPackedARM64Entry(const object::COFFObjectFile &COFF,
       report_fatal_error(Buf);
     }
     FunctionName = *FunctionNameOrErr;
+    Expected<uint64_t> FunctionAddressOrErr = Function->getAddress();
+    if (!FunctionAddressOrErr) {
+      std::string Buf;
+      llvm::raw_string_ostream OS(Buf);
+      logAllUnhandledErrors(FunctionAddressOrErr.takeError(), OS);
+      OS.flush();
+      report_fatal_error(Buf);
+    }
+    FunctionAddress = *FunctionAddressOrErr;
+  } else {
+    FunctionAddress = COFF.getPE32PlusHeader()->ImageBase + RF.BeginAddress;
   }
 
-  SW.printString("Function",
-                 formatSymbol(FunctionName, FunctionAddress, FunctionOffset));
+  SW.printString("Function", formatSymbol(FunctionName, FunctionAddress));
   SW.printBoolean("Fragment",
                   RF.Flag() == RuntimeFunctionFlag::RFF_PackedFragment);
   SW.printNumber("FunctionLength", RF.FunctionLength());

diff  --git a/llvm/tools/llvm-readobj/ARMWinEHPrinter.h b/llvm/tools/llvm-readobj/ARMWinEHPrinter.h
index 7870f97904868..3263841a267bc 100644
--- a/llvm/tools/llvm-readobj/ARMWinEHPrinter.h
+++ b/llvm/tools/llvm-readobj/ARMWinEHPrinter.h
@@ -146,13 +146,6 @@ class Decoder {
   getRelocatedSymbol(const object::COFFObjectFile &COFF,
                      const object::SectionRef &Section, uint64_t Offset);
 
-  ErrorOr<object::SymbolRef>
-  getSymbolForLocation(const object::COFFObjectFile &COFF,
-                       const object::SectionRef &Section,
-                       uint64_t OffsetInSection, uint64_t ImmediateOffset,
-                       uint64_t &SymbolAddress, uint64_t &SymbolOffset,
-                       bool FunctionOnly = false);
-
   bool dumpXDataRecord(const object::COFFObjectFile &COFF,
                        const object::SectionRef &Section,
                        uint64_t FunctionAddress, uint64_t VA);


        


More information about the llvm-commits mailing list