[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
This commit is contained in:
parent
7f0779967f
commit
1a2bc103bb
|
@ -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");
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
Loading…
Reference in New Issue