Skip to content

Commit 9265b1f

Browse files
authored
LowerTypeTests: Use jump table entry type as value type of jump table alias.
The motivation for this is that it causes the jump table entry's symbol to have an st_size equal to the jump table entry size, instead of being equal to the size of the entire jump table, which is incorrect and can lead to unexpected behavior in binary analysis tools that rely on the size field such as Bloaty. Reviewers: fmayer Reviewed By: fmayer Pull Request: #144462
1 parent 0defde8 commit 9265b1f

File tree

10 files changed

+29
-28
lines changed

10 files changed

+29
-28
lines changed

llvm/lib/Transforms/IPO/LowerTypeTests.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,8 +1701,9 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
17011701
GlobalValue::PrivateLinkage,
17021702
M.getDataLayout().getProgramAddressSpace(),
17031703
".cfi.jumptable", &M);
1704+
ArrayType *JumpTableEntryType = ArrayType::get(Int8Ty, EntrySize);
17041705
ArrayType *JumpTableType =
1705-
ArrayType::get(ArrayType::get(Int8Ty, EntrySize), Functions.size());
1706+
ArrayType::get(JumpTableEntryType, Functions.size());
17061707
auto JumpTable = ConstantExpr::getPointerCast(
17071708
JumpTableFn, PointerType::getUnqual(M.getContext()));
17081709

@@ -1723,7 +1724,7 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
17231724
if (!IsJumpTableCanonical) {
17241725
GlobalValue::LinkageTypes LT = IsExported ? GlobalValue::ExternalLinkage
17251726
: GlobalValue::InternalLinkage;
1726-
GlobalAlias *JtAlias = GlobalAlias::create(F->getValueType(), 0, LT,
1727+
GlobalAlias *JtAlias = GlobalAlias::create(JumpTableEntryType, 0, LT,
17271728
F->getName() + ".cfi_jt",
17281729
CombinedGlobalElemPtr, &M);
17291730
if (IsExported)
@@ -1748,8 +1749,9 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
17481749
} else {
17491750
assert(F->getType()->getAddressSpace() == 0);
17501751

1751-
GlobalAlias *FAlias = GlobalAlias::create(
1752-
F->getValueType(), 0, F->getLinkage(), "", CombinedGlobalElemPtr, &M);
1752+
GlobalAlias *FAlias =
1753+
GlobalAlias::create(JumpTableEntryType, 0, F->getLinkage(), "",
1754+
CombinedGlobalElemPtr, &M);
17531755
FAlias->setVisibility(F->getVisibility());
17541756
FAlias->takeName(F);
17551757
if (FAlias->hasName()) {

llvm/test/Transforms/LowerTypeTests/blockaddress-2.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; RUN: opt -S %s -passes=lowertypetests | FileCheck %s
22

33
; CHECK: @badfileops = internal global %struct.f { ptr @bad_f, ptr @bad_f }
4-
; CHECK: @bad_f = internal alias void (), ptr @.cfi.jumptable
4+
; CHECK: @bad_f = internal alias [8 x i8], ptr @.cfi.jumptable
55
; CHECK: define internal void @bad_f.cfi() !type !0 {
66
; CHECK-NEXT: ret void
77

llvm/test/Transforms/LowerTypeTests/cfi-icall-alias.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ RUN: opt test1.bc -passes=lowertypetests -lowertypetests-read-summary=in.yaml \
1212
RUN: -lowertypetests-summary-action=export -lowertypetests-write-summary=exported.yaml \
1313
RUN: -S -o - | FileCheck %s --check-prefix=REGULAR
1414
REGULAR: @__typeid__ZTSFvvE_global_addr = hidden alias i8, ptr @.cfi.jumptable
15-
REGULAR: @f = alias void (), ptr @.cfi.jumptable
15+
REGULAR: @f = alias [8 x i8], ptr @.cfi.jumptable
1616
REGULAR: define private void @.cfi.jumptable()
1717

1818
;; CHECK that @llvm.type.test() is lowered to an actual check.

llvm/test/Transforms/LowerTypeTests/export-alias.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; RUN: opt -S %s -passes=lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml | FileCheck %s
22
;
3-
; CHECK: @alias1 = weak alias void (), ptr @external_addrtaken
4-
; CHECK: @alias2 = hidden alias void (), ptr @external_addrtaken
3+
; CHECK: @alias1 = weak alias [8 x i8], ptr @external_addrtaken
4+
; CHECK: @alias2 = hidden alias [8 x i8], ptr @external_addrtaken
55
; CHECK-NOT: @alias3 = alias
66
; CHECK-NOT: @not_present
77

llvm/test/Transforms/LowerTypeTests/export-icall.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ define void @f3(i32 %x) !type !8 {
4040
; CHECK-DAG: @__typeid_typeid1_align = hidden alias i8, inttoptr (i64 3 to ptr)
4141
; CHECK-DAG: @__typeid_typeid1_size_m1 = hidden alias i8, inttoptr (i64 4 to ptr)
4242

43-
; CHECK-DAG: @h = alias void (i8), ptr [[JT1]]
44-
; CHECK-DAG: @f = alias void (i32), {{.*}}getelementptr {{.*}}ptr [[JT1]]
45-
; CHECK-DAG: @f2 = alias void (i32), {{.*}}getelementptr {{.*}}ptr [[JT1]]
46-
; CHECK-DAG: @external.cfi_jt = hidden alias void (), {{.*}}getelementptr {{.*}}ptr [[JT1]]
47-
; CHECK-DAG: @external_weak.cfi_jt = hidden alias void (), {{.*}}getelementptr {{.*}}ptr [[JT1]]
43+
; CHECK-DAG: @h = alias [8 x i8], ptr [[JT1]]
44+
; CHECK-DAG: @f = alias [8 x i8], {{.*}}getelementptr {{.*}}ptr [[JT1]]
45+
; CHECK-DAG: @f2 = alias [8 x i8], {{.*}}getelementptr {{.*}}ptr [[JT1]]
46+
; CHECK-DAG: @external.cfi_jt = hidden alias [8 x i8], {{.*}}getelementptr {{.*}}ptr [[JT1]]
47+
; CHECK-DAG: @external_weak.cfi_jt = hidden alias [8 x i8], {{.*}}getelementptr {{.*}}ptr [[JT1]]
4848

4949
; CHECK-DAG: @__typeid_typeid2_global_addr = hidden alias i8, ptr [[JT2:.*]]
5050

51-
; CHECK-DAG: @g = alias void (), ptr [[JT2]]
51+
; CHECK-DAG: @g = alias [8 x i8], ptr [[JT2]]
5252

5353
; CHECK-DAG: define hidden void @h.cfi(i8 {{.*}}) !type !{{.*}}
5454
; CHECK-DAG: declare !type !{{.*}} void @external()

llvm/test/Transforms/LowerTypeTests/function-disjoint.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
target datalayout = "e-p:64:64"
77

8-
; X64: @g = alias void (), ptr @[[JT1:.*]]
9-
; X64: @f = alias void (), ptr @[[JT0:.*]]
8+
; X64: @g = alias [8 x i8], ptr @[[JT1:.*]]
9+
; X64: @f = alias [8 x i8], ptr @[[JT0:.*]]
1010

1111
; WASM32: private constant [0 x i8] zeroinitializer
1212
@0 = private unnamed_addr constant [2 x ptr] [ptr @f, ptr @g], align 16

llvm/test/Transforms/LowerTypeTests/function.ll

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,13 @@ target datalayout = "e-p:64:64"
2828
; NATIVE: private constant [0 x i8] zeroinitializer
2929
; WASM32: private constant [0 x i8] zeroinitializer
3030

31-
; NATIVE: @f = alias void (), ptr @[[JT:.*]]
32-
33-
; X86: @g = internal alias void (), getelementptr inbounds ([2 x [8 x i8]], ptr @[[JT]], i64 0, i64 1)
34-
; ARM: @g = internal alias void (), getelementptr inbounds ([2 x [4 x i8]], ptr @[[JT]], i64 0, i64 1)
35-
; THUMB: @g = internal alias void (), getelementptr inbounds ([2 x [4 x i8]], ptr @[[JT]], i64 0, i64 1)
36-
; THUMBV6M: @g = internal alias void (), getelementptr inbounds ([2 x [16 x i8]], ptr @[[JT]], i64 0, i64 1)
37-
; RISCV: @g = internal alias void (), getelementptr inbounds ([2 x [8 x i8]], ptr @[[JT]], i64 0, i64 1)
38-
; LOONGARCH64: @g = internal alias void (), getelementptr inbounds ([2 x [8 x i8]], ptr @[[JT]], i64 0, i64 1)
31+
; JT4: @f = alias [4 x i8], ptr @[[JT:.*]]
32+
; JT8: @f = alias [8 x i8], ptr @[[JT:.*]]
33+
; JT16: @f = alias [16 x i8], ptr @[[JT:.*]]
34+
35+
; JT4: @g = internal alias [4 x i8], getelementptr inbounds ([2 x [4 x i8]], ptr @[[JT]], i64 0, i64 1)
36+
; JT8: @g = internal alias [8 x i8], getelementptr inbounds ([2 x [8 x i8]], ptr @[[JT]], i64 0, i64 1)
37+
; JT16: @g = internal alias [16 x i8], getelementptr inbounds ([2 x [16 x i8]], ptr @[[JT]], i64 0, i64 1)
3938

4039
; NATIVE: define hidden void @f.cfi()
4140
; WASM32: define void @f() !type !{{[0-9]+}} !wasm.index ![[I0:[0-9]+]]

llvm/test/Transforms/LowerTypeTests/icall-branch-funnel.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ target triple = "x86_64-unknown-linux"
66
; CHECK: @0 = private constant { i32, [0 x i8], i32 } { i32 1, [0 x i8] zeroinitializer, i32 2 }
77
; CHECK: @g1 = alias i32, ptr @0
88
; CHECK: @g2 = alias i32, getelementptr inbounds ({ i32, [0 x i8], i32 }, ptr @0, i32 0, i32 2)
9-
; CHECK: @f1 = alias void (), ptr @.cfi.jumptable
10-
; CHECK: @f2 = alias void (), getelementptr inbounds ([2 x [8 x i8]], ptr @.cfi.jumptable, i64 0, i64 1)
9+
; CHECK: @f1 = alias [8 x i8], ptr @.cfi.jumptable
10+
; CHECK: @f2 = alias [8 x i8], getelementptr inbounds ([2 x [8 x i8]], ptr @.cfi.jumptable, i64 0, i64 1)
1111

1212
@g1 = constant i32 1
1313
@g2 = constant i32 2

llvm/test/Transforms/LowerTypeTests/pr37625.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ declare !type !2 extern_weak void @external_addrtaken(i8)
1111
!1 = !{!"external_addrtaken", i8 0, !2}
1212
!2 = !{i64 0, !"typeid1"}
1313

14-
; CHECK-DAG: @external_addrtaken = alias void (i8), ptr @.cfi.jumptable
14+
; CHECK-DAG: @external_addrtaken = alias [8 x i8], ptr @.cfi.jumptable

llvm/test/Transforms/LowerTypeTests/section.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
target triple = "x86_64-unknown-linux-gnu"
77

8-
; CHECK: @f = alias void (), ptr @[[JT:.*]]
8+
; CHECK: @f = alias [8 x i8], ptr @[[JT:.*]]
99
; CHECK: define hidden void @f.cfi() section "xxx"
1010

1111
define void @f() section "xxx" !type !0 {

0 commit comments

Comments
 (0)