[MC] Produce proper section relative relocations for COFF in .debug_frame

The third parameter to Streamer.EmitSymbolValue() is "bool
IsSectionRelative = false".

For ELF, these debug sections are mapped to address zero, so a normal,
absolute address relocation works just fine, but COFF needs a section
relative relocation, and COFF is the only target where
needsDwarfSectionOffsetDirective() returns true. This matches how
EmitSymbolValue is called elsewhere in the same source file.

Differential Revision: https://reviews.llvm.org/D70661
This commit is contained in:
Martin Storsjö 2019-11-23 00:46:24 +02:00
parent 0523b5daa7
commit d4cfd0a451
2 changed files with 28 additions and 1 deletions

View File

@ -1701,7 +1701,8 @@ void FrameEmitterImpl::EmitFDE(const MCSymbol &cieStart,
MakeStartMinusEndExpr(Streamer, SectionStart, cieStart, 0);
emitAbsValue(Streamer, offset, 4);
} else {
Streamer.EmitSymbolValue(&cieStart, 4);
Streamer.EmitSymbolValue(&cieStart, 4,
asmInfo->needsDwarfSectionOffsetDirective());
}
// PC Begin

View File

@ -0,0 +1,26 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-mingw32 %s -o - | llvm-objdump -r - | FileCheck --check-prefix=COFF_X86_64 %s
// RUN: llvm-mc -filetype=obj -triple i686-mingw32 %s -o - | llvm-objdump -r - | FileCheck --check-prefix=COFF_I686 %s
.cfi_sections .debug_frame
f1:
.cfi_startproc
nop
.cfi_endproc
f2:
.cfi_startproc
nop
.cfi_endproc
// COFF_X86_64: RELOCATION RECORDS FOR [.debug_frame]:
// COFF_X86_64-NEXT: {{.*}} IMAGE_REL_AMD64_SECREL .debug_frame
// COFF_X86_64-NEXT: {{.*}} IMAGE_REL_AMD64_ADDR64 .text
// COFF_X86_64-NEXT: {{.*}} IMAGE_REL_AMD64_SECREL .debug_frame
// COFF_X86_64-NEXT: {{.*}} IMAGE_REL_AMD64_ADDR64 .text
// COFF_I686: RELOCATION RECORDS FOR [.debug_frame]:
// COFF_I686-NEXT: {{.*}} IMAGE_REL_I386_SECREL .debug_frame
// COFF_I686-NEXT: {{.*}} IMAGE_REL_I386_DIR32 .text
// COFF_I686-NEXT: {{.*}} IMAGE_REL_I386_SECREL .debug_frame
// COFF_I686-NEXT: {{.*}} IMAGE_REL_I386_DIR32 .text