From fa3003a7832a519cbe178796688f4d00aae6996a Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Mon, 13 Aug 2018 06:06:53 +0000 Subject: [PATCH] Restore correct x86_64 EH encodings in kernel code model Fixes PR37524. The exception handling encodings for x86_64 in kernel code model has been changed with r309884. Restore it to correct ones. These encodings include PersonalityEncoding, LSDAEncoding and TTypeEncoding. Differential Revision: https://reviews.llvm.org/D50490 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339534 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 23 +++--- test/CodeGen/X86/code-model-kernel.ll | 79 ++++++++++++++++++++ 2 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 test/CodeGen/X86/code-model-kernel.ll diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 2b571a02b4d..7a5fd2985c7 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -96,7 +96,7 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, TargetLoweringObjectFile::Initialize(Ctx, TgtM); TM = &TgtM; - bool Large = TgtM.getCodeModel() == CodeModel::Large; + CodeModel::Model CM = TgtM.getCodeModel(); switch (TgtM.getTargetTriple().getArch()) { case Triple::arm: @@ -124,18 +124,23 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, break; case Triple::x86_64: if (isPositionIndependent()) { - PersonalityEncoding = - dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | - (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); + PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | + ((CM == CodeModel::Small || CM == CodeModel::Medium) + ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); LSDAEncoding = dwarf::DW_EH_PE_pcrel | - (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); + (CM == CodeModel::Small + ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | - (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); + ((CM == CodeModel::Small || CM == CodeModel::Medium) + ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); } else { PersonalityEncoding = - Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4; - LSDAEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4; - TTypeEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4; + (CM == CodeModel::Small || CM == CodeModel::Medium) + ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; + LSDAEncoding = (CM == CodeModel::Small) + ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; + TTypeEncoding = (CM == CodeModel::Small) + ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; } break; case Triple::hexagon: diff --git a/test/CodeGen/X86/code-model-kernel.ll b/test/CodeGen/X86/code-model-kernel.ll new file mode 100644 index 00000000000..ba47151ac07 --- /dev/null +++ b/test/CodeGen/X86/code-model-kernel.ll @@ -0,0 +1,79 @@ +; RUN: llc -mtriple=x86_64-pc-linux-gnu -code-model=kernel %s -o - | FileCheck %s +; CHECK-LABEL: main +; CHECK: .cfi_startproc +; CHECK: .cfi_personality 0, __gxx_personality_v0 +; CHECK: .cfi_lsda 0, [[EXCEPTION_LABEL:.L[^ ]*]] +; CHECK: [[EXCEPTION_LABEL]]: +; CHECK: .byte 0 # @TType Encoding = absptr +; CHECK: .quad _ZTIi + +@_ZTIi = external constant i8* + +; Function Attrs: noinline norecurse optnone uwtable +define i32 @main() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { + %1 = alloca i32, align 4 + %2 = alloca i8* + %3 = alloca i32 + %4 = alloca i32, align 4 + store i32 0, i32* %1, align 4 + %5 = call i8* @__cxa_allocate_exception(i64 4) #2 + %6 = bitcast i8* %5 to i32* + store i32 20, i32* %6, align 16 + invoke void @__cxa_throw(i8* %5, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #3 + to label %26 unwind label %7 + +;