[lld] 1a2bc10 - [lld-macho] Fix bugs around EH_Frame symbols

Jez Ng via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 8 13:34:23 PST 2022


Author: Jez Ng
Date: 2022-11-08T16:33:32-05:00
New Revision: 1a2bc103bba04e8fba574c70c6201ba18ccc08ba

URL: https://github.com/llvm/llvm-project/commit/1a2bc103bba04e8fba574c70c6201ba18ccc08ba
DIFF: https://github.com/llvm/llvm-project/commit/1a2bc103bba04e8fba574c70c6201ba18ccc08ba.diff

LOG: [lld-macho] Fix bugs around EH_Frame symbols

While extending the map file to cover unwind info, I realized we had two
issues with our EH_Frame symbols:

1. Their size was not set
2. We would create two EH_Frame symbols per frame when we only needed
   one. This was because the Defined constructor would add the symbol
   itself to InputSection::symbols, but we were also manually appending
   the symbol to that same vector.

Note that ld64 prints "CIE" and "FDE for: <function>" instead of just
"EH_Frame", but I'm punting on that for now unless we discover that
users really depend upon it.

Reviewed By: #lld-macho, Roger

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

Added: 
    

Modified: 
    lld/MachO/InputFiles.cpp
    lld/test/MachO/map-file.s

Removed: 
    


################################################################################
diff  --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
index d522f1385a55..57b98312ed27 100644
--- a/lld/MachO/InputFiles.cpp
+++ b/lld/MachO/InputFiles.cpp
@@ -1347,11 +1347,11 @@ void ObjFile::registerEhFrames(Section &ehFrameSection) {
     // that all EH frames have an associated symbol so that we can generate
     // subtractor relocs that reference them.
     if (isec->symbols.size() == 0)
-      isec->symbols.push_back(make<Defined>(
-          "EH_Frame", isec->getFile(), isec, /*value=*/0, /*size=*/0,
-          /*isWeakDef=*/false, /*isExternal=*/false, /*isPrivateExtern=*/false,
-          /*includeInSymtab=*/false, /*isThumb=*/false,
-          /*isReferencedDynamically=*/false, /*noDeadStrip=*/false));
+      make<Defined>("EH_Frame", isec->getFile(), isec, /*value=*/0,
+                    isec->getSize(), /*isWeakDef=*/false, /*isExternal=*/false,
+                    /*isPrivateExtern=*/false, /*includeInSymtab=*/false,
+                    /*isThumb=*/false, /*isReferencedDynamically=*/false,
+                    /*noDeadStrip=*/false);
     else if (isec->symbols[0]->value != 0)
       fatal("found symbol at unexpected offset in __eh_frame");
 

diff  --git a/lld/test/MachO/map-file.s b/lld/test/MachO/map-file.s
index 008bad23fd33..7fe00fa0d99d 100644
--- a/lld/test/MachO/map-file.s
+++ b/lld/test/MachO/map-file.s
@@ -8,7 +8,9 @@
 # RUN:   --time-trace -o %t/test
 # RUN: llvm-objdump --syms --section-headers %t/test > %t/objdump
 ## Check that symbols in cstring sections aren't emitted
-# RUN: cat %t/objdump %t/map | FileCheck %s --implicit-check-not _hello_world
+## Also check that we don't have redundant EH_Frame symbols (regression test)
+# RUN: cat %t/objdump %t/map | FileCheck %s --implicit-check-not _hello_world \
+# RUN:   --implicit-check-not EH_Frame
 # RUN: FileCheck %s --check-prefix=MAPFILE < %t/test.time-trace
 
 # CHECK:      Sections:
@@ -44,15 +46,18 @@
 # CHECK-NEXT: 0x[[#%X,BSS]]       0x{{[0-9A-F]+}}   __DATA   __common
 
 # CHECK-NEXT: # Symbols:
-# CHECK-NEXT: # Address                Size        File   Name
-# CHECK-DAG:  0x[[#%X,MAIN]]           0x00000001  [  1]  _main
-# CHECK-DAG:  0x[[#%X,BAR]]            0x00000001  [  1]  _bar
-# CHECK-DAG:  0x[[#%X,FOO]]            0x00000001  [  2]  __ZTIN3foo3bar4MethE
-# CHECK-DAG:  0x[[#%X,HIWORLD]]        0x0000000E  [  3]  literal string: Hello world!\n
-# CHECK-DAG:  0x[[#%X,HIITSME]]        0x0000000F  [  3]  literal string: Hello, it's me
-# CHECK-DAG:  0x[[#%X,HIITSME + 0xf]]  0x0000000E  [  3]  literal string: Hello world!\n
-# CHECK-DAG:  0x[[#%X,NUMBER]]         0x00000001  [  1]  _number
-# CHECK-DAG:  0x[[#%X,UNWIND]]         0x0000103C  [  0]  compact unwind info
+# CHECK-NEXT: # Address                  Size        File   Name
+# CHECK-DAG:  0x[[#%X,MAIN]]             0x00000001  [  1]  _main
+# CHECK-DAG:  0x[[#%X,BAR]]              0x00000001  [  1]  _bar
+# CHECK-DAG:  0x[[#%X,FOO]]              0x00000001  [  2]  __ZTIN3foo3bar4MethE
+# CHECK-DAG:  0x[[#%X,HIWORLD]]          0x0000000E  [  3]  literal string: Hello world!\n
+# CHECK-DAG:  0x[[#%X,HIITSME]]          0x0000000F  [  3]  literal string: Hello, it's me
+# CHECK-DAG:  0x[[#%X,HIITSME + 0xf]]    0x0000000E  [  3]  literal string: Hello world!\n
+# CHECK-DAG:  0x[[#%X,NUMBER]]           0x00000001  [  1]  _number
+# CHECK-DAG:  0x[[#%X,UNWIND]]           0x0000103C  [  0]  compact unwind info
+## Note: ld64 prints "CIE" and "FDE for: <function>" instead of "EH_Frame".
+# CHECK-DAG:  0x[[#%X,EH_FRAME]]         0x00000018  [  1]  EH_Frame
+# CHECK-DAG:  0x[[#%X,EH_FRAME + 0x18]]  0x00000020  [  1]  EH_Frame
 
 # MAPFILE: "name":"Total Write map file"
 


        


More information about the llvm-commits mailing list