diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index 7886ab62ca5..858181dd4af 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -272,6 +272,12 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) { case Triple::mips64: case Triple::mips64el: FDECFIEncoding = dwarf::DW_EH_PE_sdata8; + break; + case Triple::x86_64: + FDECFIEncoding = dwarf::DW_EH_PE_pcrel | + ((CMModel == CodeModel::Large) ? dwarf::DW_EH_PE_sdata8 + : dwarf::DW_EH_PE_sdata4); + break; default: FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; diff --git a/test/MC/ELF/cfi-large-model.s b/test/MC/ELF/cfi-large-model.s new file mode 100644 index 00000000000..16073ad7f0e --- /dev/null +++ b/test/MC/ELF/cfi-large-model.s @@ -0,0 +1,27 @@ +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu -code-model=large %s \ +// RUN: -o - | llvm-readobj -s -sd | FileCheck %s + +// CHECK: Section { +// CHECK: Index: +// CHECK: Name: .eh_frame +// CHECK-NEXT: Type: SHT_PROGBITS +// CHECK-NEXT: Flags [ +// CHECK-NEXT: SHF_ALLOC +// CHECK-NEXT: ] +// CHECK-NEXT: Address: 0x0 +// CHECK-NEXT: Offset: 0x40 +// CHECK-NEXT: Size: 56 +// CHECK-NEXT: Link: 0 +// CHECK-NEXT: Info: 0 +// CHECK-NEXT: AddressAlignment: 8 +// CHECK-NEXT: EntrySize: 0 +// CHECK-NEXT: SectionData ( +// CHECK-NEXT: 0000: 14000000 00000000 037A5200 01781001 |.........zR..x..| +// CHECK-NEXT: 0010: 1C0C0708 90010000 1C000000 1C000000 |................| +// CHECK-NEXT: 0020: 00000000 00000000 00000000 00000000 |................| +// CHECK-NEXT: 0030: 00000000 00000000 |........| +// CHECK-NEXT: ) + +f: + .cfi_startproc + .cfi_endproc