Skip to content

Commit a9d4ddd

Browse files
authored
[MergeFuncs/CFI] Ensure all type metadata is propogated for CFI (#88218)
I noticed that we weren't propagating ALL type metadata that was attached to CFI functions: # BEFORE ``` ; Function Attrs: minsize nounwind optsize ssp uwtable(sync) define internal void @foo(ptr nocapture noundef readonly %0) #0 !dbg !62311 !type !34028 !type !34029 !type !34030 ... fn merging ; Function Attrs: minsize nounwind optsize ssp uwtable(sync) define internal void @foo(ptr nocapture noundef readonly %0) #0 !type !34028 ``` # AFTER ``` ; Function Attrs: minsize nounwind optsize ssp uwtable(sync) define internal void @foo(ptr nocapture noundef readonly %0) #0 !dbg !62311 !type !34028 !type !34029 !type !34030 ... fn merging ; Function Attrs: minsize nounwind optsize ssp uwtable(sync) define internal void @foo(ptr nocapture noundef readonly %0) #0 !type !type !34028 !type !34029 !type !34030 ``` This patch makes sure that the entire vector of metadata is copied over.
1 parent d8f1e5d commit a9d4ddd

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

llvm/lib/Transforms/IPO/MergeFunctions.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -712,11 +712,13 @@ static bool canCreateThunkFor(Function *F) {
712712
return true;
713713
}
714714

715-
/// Copy metadata from one function to another.
716-
static void copyMetadataIfPresent(Function *From, Function *To, StringRef Key) {
717-
if (MDNode *MD = From->getMetadata(Key)) {
718-
To->setMetadata(Key, MD);
719-
}
715+
/// Copy all metadata of a specific kind from one function to another.
716+
static void copyMetadataIfPresent(Function *From, Function *To,
717+
StringRef Kind) {
718+
SmallVector<MDNode *, 4> MDs;
719+
From->getMetadata(Kind, MDs);
720+
for (MDNode *MD : MDs)
721+
To->addMetadata(Kind, *MD);
720722
}
721723

722724
// Replace G with a simple tail call to bitcast(F). Also (unless

llvm/test/Transforms/MergeFunc/cfi-thunk-merging.ll

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ attributes #3 = { noreturn nounwind }
9898
!4 = !{i64 0, !"_ZTSFiiE.generalized"}
9999
!5 = !{}
100100
; CHECK-LABEL: define dso_local i32 @f
101-
; CHECK-SAME: (i32 noundef [[ARG:%.*]]) #[[ATTR0:[0-9]+]] !type !2 !type !3 {
101+
; CHECK-SAME: (i32 noundef [[ARG:%.*]]) #[[ATTR0:[0-9]+]] !type [[META2:![0-9]+]] !type [[META3:![0-9]+]] {
102102
; CHECK-NEXT: entry:
103103
; CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4
104104
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -119,7 +119,7 @@ attributes #3 = { noreturn nounwind }
119119
;
120120
;
121121
; CHECK-LABEL: define dso_local i32 @g
122-
; CHECK-SAME: (i32 noundef [[B:%.*]]) #[[ATTR0]] !type !2 !type !3 {
122+
; CHECK-SAME: (i32 noundef [[B:%.*]]) #[[ATTR0]] !type [[META2]] !type [[META3]] {
123123
; CHECK-NEXT: entry:
124124
; CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
125125
; CHECK-NEXT: [[FP:%.*]] = alloca ptr, align 8
@@ -130,25 +130,25 @@ attributes #3 = { noreturn nounwind }
130130
; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], ptr @f, ptr @f_thunk
131131
; CHECK-NEXT: store ptr [[COND]], ptr [[FP]], align 8
132132
; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[FP]], align 8
133-
; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.type.test(ptr [[TMP2]], metadata !"_ZTSFiiE"), !nosanitize !4
134-
; CHECK-NEXT: br i1 [[TMP3]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize !4
133+
; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.type.test(ptr [[TMP2]], metadata !"_ZTSFiiE"), !nosanitize [[META4:![0-9]+]]
134+
; CHECK-NEXT: br i1 [[TMP3]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META4]]
135135
; CHECK: trap:
136-
; CHECK-NEXT: call void @llvm.ubsantrap(i8 2) #[[ATTR3:[0-9]+]], !nosanitize !4
137-
; CHECK-NEXT: unreachable, !nosanitize !4
136+
; CHECK-NEXT: call void @llvm.ubsantrap(i8 2) #[[ATTR3:[0-9]+]], !nosanitize [[META4]]
137+
; CHECK-NEXT: unreachable, !nosanitize [[META4]]
138138
; CHECK: cont:
139139
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[B_ADDR]], align 4
140140
; CHECK-NEXT: [[CALL:%.*]] = call i32 [[TMP2]](i32 noundef [[TMP4]])
141141
; CHECK-NEXT: ret i32 [[CALL]]
142142
;
143143
;
144144
; CHECK-LABEL: define dso_local i32 @f_thunk
145-
; CHECK-SAME: (i32 noundef [[TMP0:%.*]]) #[[ATTR0]] !type !2 {
145+
; CHECK-SAME: (i32 noundef [[TMP0:%.*]]) #[[ATTR0]] !type [[META2]] !type [[META3]] {
146146
; CHECK-NEXT: [[TMP2:%.*]] = tail call i32 @f(i32 noundef [[TMP0]]) #[[ATTR0]]
147147
; CHECK-NEXT: ret i32 [[TMP2]]
148148
;
149149
;
150150
; LOWERTYPETESTS-LABEL: define dso_local i32 @f
151-
; LOWERTYPETESTS-SAME: (i32 noundef [[ARG:%.*]]) #[[ATTR0:[0-9]+]] !type !2 !type !3 {
151+
; LOWERTYPETESTS-SAME: (i32 noundef [[ARG:%.*]]) #[[ATTR0:[0-9]+]] !type [[META2:![0-9]+]] !type [[META3:![0-9]+]] {
152152
; LOWERTYPETESTS-NEXT: entry:
153153
; LOWERTYPETESTS-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4
154154
; LOWERTYPETESTS-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -169,7 +169,7 @@ attributes #3 = { noreturn nounwind }
169169
;
170170
;
171171
; LOWERTYPETESTS-LABEL: define dso_local i32 @g
172-
; LOWERTYPETESTS-SAME: (i32 noundef [[B:%.*]]) #[[ATTR0]] !type !2 !type !3 {
172+
; LOWERTYPETESTS-SAME: (i32 noundef [[B:%.*]]) #[[ATTR0]] !type [[META2]] !type [[META3]] {
173173
; LOWERTYPETESTS-NEXT: entry:
174174
; LOWERTYPETESTS-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
175175
; LOWERTYPETESTS-NEXT: [[FP:%.*]] = alloca ptr, align 8
@@ -186,18 +186,18 @@ attributes #3 = { noreturn nounwind }
186186
; LOWERTYPETESTS-NEXT: [[TMP6:%.*]] = shl i64 [[TMP4]], 61
187187
; LOWERTYPETESTS-NEXT: [[TMP7:%.*]] = or i64 [[TMP5]], [[TMP6]]
188188
; LOWERTYPETESTS-NEXT: [[TMP8:%.*]] = icmp ule i64 [[TMP7]], 1
189-
; LOWERTYPETESTS-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize !4
189+
; LOWERTYPETESTS-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META4:![0-9]+]]
190190
; LOWERTYPETESTS: trap:
191-
; LOWERTYPETESTS-NEXT: call void @llvm.ubsantrap(i8 2) #[[ATTR4:[0-9]+]], !nosanitize !4
192-
; LOWERTYPETESTS-NEXT: unreachable, !nosanitize !4
191+
; LOWERTYPETESTS-NEXT: call void @llvm.ubsantrap(i8 2) #[[ATTR4:[0-9]+]], !nosanitize [[META4]]
192+
; LOWERTYPETESTS-NEXT: unreachable, !nosanitize [[META4]]
193193
; LOWERTYPETESTS: cont:
194194
; LOWERTYPETESTS-NEXT: [[TMP9:%.*]] = load i32, ptr [[B_ADDR]], align 4
195195
; LOWERTYPETESTS-NEXT: [[CALL:%.*]] = call i32 [[TMP2]](i32 noundef [[TMP9]])
196196
; LOWERTYPETESTS-NEXT: ret i32 [[CALL]]
197197
;
198198
;
199199
; LOWERTYPETESTS-LABEL: define dso_local i32 @f_thunk
200-
; LOWERTYPETESTS-SAME: (i32 noundef [[TMP0:%.*]]) #[[ATTR0]] !type !2 {
200+
; LOWERTYPETESTS-SAME: (i32 noundef [[TMP0:%.*]]) #[[ATTR0]] !type [[META2]] !type [[META3]] {
201201
; LOWERTYPETESTS-NEXT: [[TMP2:%.*]] = tail call i32 @f(i32 noundef [[TMP0]]) #[[ATTR0]]
202202
; LOWERTYPETESTS-NEXT: ret i32 [[TMP2]]
203203
;

0 commit comments

Comments
 (0)