diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index 2bad83e44a79a..63f8a6e1b6d44 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -1019,8 +1019,22 @@ LowerTypeTestsModule::importTypeId(StringRef TypeId) { return C; }; - if (TIL.TheKind != TypeTestResolution::Unsat) - TIL.OffsetedGlobal = ImportGlobal("global_addr"); + if (TIL.TheKind != TypeTestResolution::Unsat) { + auto *GV = ImportGlobal("global_addr"); + // This is either a vtable (in .data.rel.ro) or a jump table (in .text). + // Either way it's expected to be in the low 2 GiB, so set the small code + // model. + // + // For .data.rel.ro, we currently place all such sections in the low 2 GiB + // [1], and for .text the sections are expected to be in the low 2 GiB under + // the small and medium code models [2] and this pass only supports those + // code models (e.g. jump tables use jmp instead of movabs/jmp). + // + // [1]https://github.com/llvm/llvm-project/pull/137742 + // [2]https://maskray.me/blog/2023-05-14-relocation-overflow-and-code-models + GV->setCodeModel(CodeModel::Small); + TIL.OffsetedGlobal = GV; + } if (TIL.TheKind == TypeTestResolution::ByteArray || TIL.TheKind == TypeTestResolution::Inline || diff --git a/llvm/test/Transforms/LowerTypeTests/import.ll b/llvm/test/Transforms/LowerTypeTests/import.ll index 1eff4bbbbdf97..c6566b84a4361 100644 --- a/llvm/test/Transforms/LowerTypeTests/import.ll +++ b/llvm/test/Transforms/LowerTypeTests/import.ll @@ -6,29 +6,29 @@ target datalayout = "e-p:64:64" declare i1 @llvm.type.test(ptr %ptr, metadata %bitset) nounwind readnone -; CHECK-DAG: @__typeid_single_global_addr = external hidden global [0 x i8] -; CHECK-DAG: @__typeid_inline6_global_addr = external hidden global [0 x i8] +; CHECK-DAG: @__typeid_single_global_addr = external hidden global [0 x i8], code_model "small" +; CHECK-DAG: @__typeid_inline6_global_addr = external hidden global [0 x i8], code_model "small" ; X86-DAG: @__typeid_inline6_align = external hidden global [0 x i8], !absolute_symbol !0 ; X86-DAG: @__typeid_inline6_size_m1 = external hidden global [0 x i8], !absolute_symbol !1 ; X86-DAG: @__typeid_inline6_inline_bits = external hidden global [0 x i8], !absolute_symbol !2 -; CHECK-DAG: @__typeid_inline5_global_addr = external hidden global [0 x i8] +; CHECK-DAG: @__typeid_inline5_global_addr = external hidden global [0 x i8], code_model "small" ; X86-DAG: @__typeid_inline5_align = external hidden global [0 x i8], !absolute_symbol !0 ; X86-DAG: @__typeid_inline5_size_m1 = external hidden global [0 x i8], !absolute_symbol !3 ; X86-DAG: @__typeid_inline5_inline_bits = external hidden global [0 x i8], !absolute_symbol !4 -; CHECK-DAG: @__typeid_bytearray32_global_addr = external hidden global [0 x i8] +; CHECK-DAG: @__typeid_bytearray32_global_addr = external hidden global [0 x i8], code_model "small" ; X86-DAG: @__typeid_bytearray32_align = external hidden global [0 x i8], !absolute_symbol !0 ; X86-DAG: @__typeid_bytearray32_size_m1 = external hidden global [0 x i8], !absolute_symbol !4 ; CHECK-DAG: @__typeid_bytearray32_byte_array = external hidden global [0 x i8] ; X86-DAG: @__typeid_bytearray32_bit_mask = external hidden global [0 x i8], !absolute_symbol !0 -; CHECK-DAG: @__typeid_bytearray7_global_addr = external hidden global [0 x i8] +; CHECK-DAG: @__typeid_bytearray7_global_addr = external hidden global [0 x i8], code_model "small" ; X86-DAG: @__typeid_bytearray7_align = external hidden global [0 x i8], !absolute_symbol !0 ; X86-DAG: @__typeid_bytearray7_size_m1 = external hidden global [0 x i8], !absolute_symbol !5 ; CHECK-DAG: @__typeid_bytearray7_byte_array = external hidden global [0 x i8] ; X86-DAG: @__typeid_bytearray7_bit_mask = external hidden global [0 x i8], !absolute_symbol !0 -; CHECK-DAG: @__typeid_allones32_global_addr = external hidden global [0 x i8] +; CHECK-DAG: @__typeid_allones32_global_addr = external hidden global [0 x i8], code_model "small" ; X86-DAG: @__typeid_allones32_align = external hidden global [0 x i8], !absolute_symbol !0 ; X86-DAG: @__typeid_allones32_size_m1 = external hidden global [0 x i8], !absolute_symbol !4 -; CHECK-DAG: @__typeid_allones7_global_addr = external hidden global [0 x i8] +; CHECK-DAG: @__typeid_allones7_global_addr = external hidden global [0 x i8], code_model "small" ; X86-DAG: @__typeid_allones7_align = external hidden global [0 x i8], !absolute_symbol !0 ; X86-DAG: @__typeid_allones7_size_m1 = external hidden global [0 x i8], !absolute_symbol !5