Index: include/llvm/MC/MCObjectFileInfo.h =================================================================== --- include/llvm/MC/MCObjectFileInfo.h +++ include/llvm/MC/MCObjectFileInfo.h @@ -210,7 +210,7 @@ public: void InitMCObjectFileInfo(const Triple &TT, bool PIC, MCContext &ctx, - bool LargeCodeModel = false); + CodeModel::Model CM = CodeModel::Small); bool getSupportsWeakOmittedEHFrame() const { return SupportsWeakOmittedEHFrame; @@ -384,11 +384,12 @@ private: Environment Env; bool PositionIndependent; + CodeModel::Model CMModel; MCContext *Ctx; Triple TT; void initMachOMCObjectFileInfo(const Triple &T); - void initELFMCObjectFileInfo(const Triple &T, bool Large); + void initELFMCObjectFileInfo(const Triple &T); void initCOFFMCObjectFileInfo(const Triple &T); void initWasmMCObjectFileInfo(const Triple &T); Index: lib/MC/MCObjectFileInfo.cpp =================================================================== --- lib/MC/MCObjectFileInfo.cpp +++ lib/MC/MCObjectFileInfo.cpp @@ -291,7 +291,7 @@ TLSExtraDataSection = TLSTLVSection; } -void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) { +void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T) { switch (T.getArch()) { case Triple::mips: case Triple::mipsel: @@ -305,7 +305,8 @@ case Triple::ppc64le: case Triple::x86_64: FDECFIEncoding = dwarf::DW_EH_PE_pcrel | - (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); + ((CMModel == CodeModel::Large) ? dwarf::DW_EH_PE_sdata8 + : dwarf::DW_EH_PE_sdata4); break; case Triple::bpfel: case Triple::bpfeb: @@ -342,18 +343,23 @@ break; case Triple::x86_64: if (PositionIndependent) { - 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 | + ((CMModel == CodeModel::Small || CMModel == 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); + (CMModel == 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); + ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) + ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); } 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; + (CMModel == CodeModel::Small || CMModel == CodeModel::Medium) + ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; + LSDAEncoding = (CMModel == CodeModel::Small) + ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; + TTypeEncoding = (CMModel == CodeModel::Small) + ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; } break; case Triple::hexagon: @@ -898,8 +904,9 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC, MCContext &ctx, - bool LargeCodeModel) { + CodeModel::Model cm) { PositionIndependent = PIC; + CMModel = cm; Ctx = &ctx; // Common. @@ -937,7 +944,7 @@ break; case Triple::ELF: Env = IsELF; - initELFMCObjectFileInfo(TT, LargeCodeModel); + initELFMCObjectFileInfo(TT); break; case Triple::Wasm: Env = IsWasm; Index: lib/Target/TargetLoweringObjectFile.cpp =================================================================== --- lib/Target/TargetLoweringObjectFile.cpp +++ lib/Target/TargetLoweringObjectFile.cpp @@ -44,7 +44,7 @@ delete Mang; Mang = new Mangler(); InitMCObjectFileInfo(TM.getTargetTriple(), TM.isPositionIndependent(), *Ctx, - TM.getCodeModel() == CodeModel::Large); + TM.getCodeModel()); } TargetLoweringObjectFile::~TargetLoweringObjectFile() { Index: test/MC/X86/code-model-kernel.ll =================================================================== --- /dev/null +++ test/MC/X86/code-model-kernel.ll @@ -0,0 +1,75 @@ +; RUN: llc -mtriple=x86_64-pc-linux-gnu -code-model=kernel %s -o - | FileCheck %s +; CHECK-LABEL: GCC_except_table0 +; CHECK: @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 + +;