[llvm] 70c4930 - [llvm-readobj] [ARMWinEH] Try to resolve label symbols into regular ones

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Tue May 4 12:39:12 PDT 2021


Author: Martin Storsjö
Date: 2021-05-04T22:22:18+03:00
New Revision: 70c4930637fa9a43eabcbde66e5a74262da1e46c

URL: https://github.com/llvm/llvm-project/commit/70c4930637fa9a43eabcbde66e5a74262da1e46c
DIFF: https://github.com/llvm/llvm-project/commit/70c4930637fa9a43eabcbde66e5a74262da1e46c.diff

LOG: [llvm-readobj] [ARMWinEH] Try to resolve label symbols into regular ones

Unwind info generated by MSVC tends to have relocations pointing at
static "label" symbols like "$LN4" instead of regular ones based on
the actual function's name. Try to resolve such symbols to a non-label
symbol if possible (ideally to an external symbol), to improve
the readability.

Differential Revision: https://reviews.llvm.org/D101567

Added: 
    llvm/test/tools/llvm-readobj/COFF/arm64-unwind-preferred-symbol.yaml

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

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-readobj/COFF/arm64-unwind-preferred-symbol.yaml b/llvm/test/tools/llvm-readobj/COFF/arm64-unwind-preferred-symbol.yaml
new file mode 100644
index 000000000000..54dd127fd0d7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/arm64-unwind-preferred-symbol.yaml
@@ -0,0 +1,81 @@
+# Check that we print the external symbol "func", even though the pdata
+# relocation points at the '$LN4' symbol.
+
+# RUN: yaml2obj %s -o %t.obj
+# RUN: llvm-readobj --unwind %t.obj | FileCheck %s
+
+# CHECK: Function: func (0x0)
+
+--- !COFF
+header:
+  Machine:         IMAGE_FILE_MACHINE_ARM64
+  Characteristics: [  ]
+sections:
+  - Name:            '.text$mn'
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+    Alignment:       8
+    SectionData:     FE0F1FF8FF0301D1E003009100000094FF030191FE0741F8C0035FD6
+    Relocations:
+      - VirtualAddress:  12
+        SymbolName:      other
+        Type:            IMAGE_REL_ARM64_BRANCH26
+  - Name:            .pdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ ]
+    Alignment:       4
+    SectionData:     000000001D00A002
+    Relocations:
+      - VirtualAddress:  0
+        SymbolName:      '$LN4'
+        Type:            IMAGE_REL_ARM64_ADDR32NB
+symbols:
+  - Name:            '.text$mn'
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+    SectionDefinition:
+      Length:          28
+      NumberOfRelocations: 1
+      NumberOfLinenumbers: 0
+      CheckSum:        1015150991
+      Number:          0
+      Selection:       IMAGE_COMDAT_SELECT_NODUPLICATES
+  - Name:            other
+    Value:           0
+    SectionNumber:   0
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+  - Name:            func
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+  - Name:            '$LN4'
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_LABEL
+  - Name:            .pdata
+    Value:           0
+    SectionNumber:   2
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+    SectionDefinition:
+      Length:          8
+      NumberOfRelocations: 1
+      NumberOfLinenumbers: 0
+      CheckSum:        3799667335
+      Number:          2
+      Selection:       IMAGE_COMDAT_SELECT_ASSOCIATIVE
+  - Name:            '$pdata$func'
+    Value:           0
+    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 cc9e3d944bbe..99ee639fc45d 100644
--- a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp
+++ b/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp
@@ -238,6 +238,28 @@ ErrorOr<SymbolRef> Decoder::getRelocatedSymbol(const COFFObjectFile &,
   return inconvertibleErrorCode();
 }
 
+SymbolRef Decoder::getPreferredSymbol(const COFFObjectFile &COFF,
+                                      SymbolRef Sym) {
+  // The symbol resolved by getRelocatedSymbol can be any internal
+  // nondescriptive symbol; try to resolve a more descriptive one.
+  COFFSymbolRef CoffSym = COFF.getCOFFSymbol(Sym);
+  if (CoffSym.getStorageClass() != COFF::IMAGE_SYM_CLASS_LABEL)
+    return Sym;
+  for (const auto &S : COFF.symbols()) {
+    COFFSymbolRef CS = COFF.getCOFFSymbol(S);
+    if (CS.getSectionNumber() == CoffSym.getSectionNumber() &&
+        CS.getValue() == CoffSym.getValue()) {
+      if (CS.isExternal())
+        return S;
+      if (CS.getStorageClass() != COFF::IMAGE_SYM_CLASS_LABEL) {
+        Sym = S;
+        CoffSym = CS;
+      }
+    }
+  }
+  return Sym;
+}
+
 ErrorOr<SymbolRef> Decoder::getSymbolForLocation(
     const COFFObjectFile &COFF, const SectionRef &Section,
     uint64_t OffsetInSection, uint64_t ImmediateOffset, uint64_t &SymbolAddress,
@@ -270,6 +292,8 @@ ErrorOr<SymbolRef> Decoder::getSymbolForLocation(
     SymbolOffset = 0;
     SymOrErr = getSymbol(COFF, SymbolAddress, FunctionOnly);
   }
+  if (SymOrErr && FunctionOnly) // Resolve label symbols into function names
+    SymOrErr = getPreferredSymbol(COFF, *SymOrErr);
   return SymOrErr;
 }
 

diff  --git a/llvm/tools/llvm-readobj/ARMWinEHPrinter.h b/llvm/tools/llvm-readobj/ARMWinEHPrinter.h
index 7870f9790486..efe16850c7fa 100644
--- a/llvm/tools/llvm-readobj/ARMWinEHPrinter.h
+++ b/llvm/tools/llvm-readobj/ARMWinEHPrinter.h
@@ -153,6 +153,9 @@ class Decoder {
                        uint64_t &SymbolAddress, uint64_t &SymbolOffset,
                        bool FunctionOnly = false);
 
+  object::SymbolRef getPreferredSymbol(const object::COFFObjectFile &COFF,
+                                       object::SymbolRef Sym);
+
   bool dumpXDataRecord(const object::COFFObjectFile &COFF,
                        const object::SectionRef &Section,
                        uint64_t FunctionAddress, uint64_t VA);


        


More information about the llvm-commits mailing list