Skip to content

Commit 782a9e9

Browse files
authored
LowerTypeTests: Set small code model on imported globals.
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. Reviewers: fmayer Reviewed By: fmayer Pull Request: #141324
1 parent 645f0e6 commit 782a9e9

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

llvm/lib/Transforms/IPO/LowerTypeTests.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,8 +1019,22 @@ LowerTypeTestsModule::importTypeId(StringRef TypeId) {
10191019
return C;
10201020
};
10211021

1022-
if (TIL.TheKind != TypeTestResolution::Unsat)
1023-
TIL.OffsetedGlobal = ImportGlobal("global_addr");
1022+
if (TIL.TheKind != TypeTestResolution::Unsat) {
1023+
auto *GV = ImportGlobal("global_addr");
1024+
// This is either a vtable (in .data.rel.ro) or a jump table (in .text).
1025+
// Either way it's expected to be in the low 2 GiB, so set the small code
1026+
// model.
1027+
//
1028+
// For .data.rel.ro, we currently place all such sections in the low 2 GiB
1029+
// [1], and for .text the sections are expected to be in the low 2 GiB under
1030+
// the small and medium code models [2] and this pass only supports those
1031+
// code models (e.g. jump tables use jmp instead of movabs/jmp).
1032+
//
1033+
// [1]https://github.com/llvm/llvm-project/pull/137742
1034+
// [2]https://maskray.me/blog/2023-05-14-relocation-overflow-and-code-models
1035+
GV->setCodeModel(CodeModel::Small);
1036+
TIL.OffsetedGlobal = GV;
1037+
}
10241038

10251039
if (TIL.TheKind == TypeTestResolution::ByteArray ||
10261040
TIL.TheKind == TypeTestResolution::Inline ||

llvm/test/Transforms/LowerTypeTests/import.ll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,29 @@ target datalayout = "e-p:64:64"
66

77
declare i1 @llvm.type.test(ptr %ptr, metadata %bitset) nounwind readnone
88

9-
; CHECK-DAG: @__typeid_single_global_addr = external hidden global [0 x i8]
10-
; CHECK-DAG: @__typeid_inline6_global_addr = external hidden global [0 x i8]
9+
; CHECK-DAG: @__typeid_single_global_addr = external hidden global [0 x i8], code_model "small"
10+
; CHECK-DAG: @__typeid_inline6_global_addr = external hidden global [0 x i8], code_model "small"
1111
; X86-DAG: @__typeid_inline6_align = external hidden global [0 x i8], !absolute_symbol !0
1212
; X86-DAG: @__typeid_inline6_size_m1 = external hidden global [0 x i8], !absolute_symbol !1
1313
; X86-DAG: @__typeid_inline6_inline_bits = external hidden global [0 x i8], !absolute_symbol !2
14-
; CHECK-DAG: @__typeid_inline5_global_addr = external hidden global [0 x i8]
14+
; CHECK-DAG: @__typeid_inline5_global_addr = external hidden global [0 x i8], code_model "small"
1515
; X86-DAG: @__typeid_inline5_align = external hidden global [0 x i8], !absolute_symbol !0
1616
; X86-DAG: @__typeid_inline5_size_m1 = external hidden global [0 x i8], !absolute_symbol !3
1717
; X86-DAG: @__typeid_inline5_inline_bits = external hidden global [0 x i8], !absolute_symbol !4
18-
; CHECK-DAG: @__typeid_bytearray32_global_addr = external hidden global [0 x i8]
18+
; CHECK-DAG: @__typeid_bytearray32_global_addr = external hidden global [0 x i8], code_model "small"
1919
; X86-DAG: @__typeid_bytearray32_align = external hidden global [0 x i8], !absolute_symbol !0
2020
; X86-DAG: @__typeid_bytearray32_size_m1 = external hidden global [0 x i8], !absolute_symbol !4
2121
; CHECK-DAG: @__typeid_bytearray32_byte_array = external hidden global [0 x i8]
2222
; X86-DAG: @__typeid_bytearray32_bit_mask = external hidden global [0 x i8], !absolute_symbol !0
23-
; CHECK-DAG: @__typeid_bytearray7_global_addr = external hidden global [0 x i8]
23+
; CHECK-DAG: @__typeid_bytearray7_global_addr = external hidden global [0 x i8], code_model "small"
2424
; X86-DAG: @__typeid_bytearray7_align = external hidden global [0 x i8], !absolute_symbol !0
2525
; X86-DAG: @__typeid_bytearray7_size_m1 = external hidden global [0 x i8], !absolute_symbol !5
2626
; CHECK-DAG: @__typeid_bytearray7_byte_array = external hidden global [0 x i8]
2727
; X86-DAG: @__typeid_bytearray7_bit_mask = external hidden global [0 x i8], !absolute_symbol !0
28-
; CHECK-DAG: @__typeid_allones32_global_addr = external hidden global [0 x i8]
28+
; CHECK-DAG: @__typeid_allones32_global_addr = external hidden global [0 x i8], code_model "small"
2929
; X86-DAG: @__typeid_allones32_align = external hidden global [0 x i8], !absolute_symbol !0
3030
; X86-DAG: @__typeid_allones32_size_m1 = external hidden global [0 x i8], !absolute_symbol !4
31-
; CHECK-DAG: @__typeid_allones7_global_addr = external hidden global [0 x i8]
31+
; CHECK-DAG: @__typeid_allones7_global_addr = external hidden global [0 x i8], code_model "small"
3232
; X86-DAG: @__typeid_allones7_align = external hidden global [0 x i8], !absolute_symbol !0
3333
; X86-DAG: @__typeid_allones7_size_m1 = external hidden global [0 x i8], !absolute_symbol !5
3434

0 commit comments

Comments
 (0)