Skip to content

Commit c2a3888

Browse files
committed
[IR] Use Min behavior for module flag "PIC Level"
Using Max for both "PIC Level" and "PIE Level" is inconsistent. PIC imposes less restriction while PIE imposes more restriction. The result generally picks the more restrictive behavior: Min for PIC. This choice matches `ld -r`: a non-pic object and a pic object merge into a result which should be treated as non-pic. To allow linking "PIC Level" using Error/Max from old bitcode files, upgrade Error/Max to Min. Reviewed By: tejohnson Differential Revision: https://reviews.llvm.org/D130531
1 parent 37c47b2 commit c2a3888

14 files changed

+56
-38
lines changed

clang/test/CodeGen/piclevels.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
// RUN: %clang_cc1 -emit-llvm -pic-level 1 -pic-is-pie %s -o - | FileCheck %s -check-prefix=CHECK-SMALLPIC -check-prefix=CHECK-SMALLPIE
55

66
// CHECK-BIGPIC: !llvm.module.flags = !{{{.*}}}
7-
// CHECK-BIGPIC: !{{[0-9]+}} = !{i32 7, !"PIC Level", i32 2}
7+
// CHECK-BIGPIC: ![[#]] = !{i32 8, !"PIC Level", i32 2}
88
// CHECK-SMALLPIC: !llvm.module.flags = !{{{.*}}}
9-
// CHECK-SMALLPIC: !{{[0-9]+}} = !{i32 7, !"PIC Level", i32 1}
9+
// CHECK-SMALLPIC: ![[#]] = !{i32 8, !"PIC Level", i32 1}
1010
// CHECK-NOPIE-NOT: PIE Level
11-
// CHECK-BIGPIE: !{{[0-9]+}} = !{i32 7, !"PIE Level", i32 2}
12-
// CHECK-SMALLPIE: !{{[0-9]+}} = !{i32 7, !"PIE Level", i32 1}
11+
// CHECK-BIGPIE: ![[#]] = !{i32 7, !"PIE Level", i32 2}
12+
// CHECK-SMALLPIE: ![[#]] = !{i32 7, !"PIE Level", i32 1}

llvm/lib/IR/AutoUpgrade.cpp

+20-12
Original file line numberDiff line numberDiff line change
@@ -4391,26 +4391,34 @@ bool llvm::UpgradeModuleFlags(Module &M) {
43914391
MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(1));
43924392
if (!ID)
43934393
continue;
4394+
auto SetBehavior = [&](Module::ModFlagBehavior B) {
4395+
Metadata *Ops[3] = {ConstantAsMetadata::get(ConstantInt::get(
4396+
Type::getInt32Ty(M.getContext()), B)),
4397+
MDString::get(M.getContext(), ID->getString()),
4398+
Op->getOperand(2)};
4399+
ModFlags->setOperand(I, MDNode::get(M.getContext(), Ops));
4400+
Changed = true;
4401+
};
4402+
43944403
if (ID->getString() == "Objective-C Image Info Version")
43954404
HasObjCFlag = true;
43964405
if (ID->getString() == "Objective-C Class Properties")
43974406
HasClassProperties = true;
4398-
// Upgrade PIC/PIE Module Flags. The module flag behavior for these two
4399-
// field was Error and now they are Max.
4400-
if (ID->getString() == "PIC Level" || ID->getString() == "PIE Level") {
4407+
// Upgrade PIC from Error/Max to Min.
4408+
if (ID->getString() == "PIC Level") {
44014409
if (auto *Behavior =
44024410
mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(0))) {
4403-
if (Behavior->getLimitedValue() == Module::Error) {
4404-
Type *Int32Ty = Type::getInt32Ty(M.getContext());
4405-
Metadata *Ops[3] = {
4406-
ConstantAsMetadata::get(ConstantInt::get(Int32Ty, Module::Max)),
4407-
MDString::get(M.getContext(), ID->getString()),
4408-
Op->getOperand(2)};
4409-
ModFlags->setOperand(I, MDNode::get(M.getContext(), Ops));
4410-
Changed = true;
4411-
}
4411+
uint64_t V = Behavior->getLimitedValue();
4412+
if (V == Module::Error || V == Module::Max)
4413+
SetBehavior(Module::Min);
44124414
}
44134415
}
4416+
// Upgrade "PIE Level" from Error to Max.
4417+
if (ID->getString() == "PIE Level")
4418+
if (auto *Behavior =
4419+
mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(0)))
4420+
if (Behavior->getLimitedValue() == Module::Error)
4421+
SetBehavior(Module::Max);
44144422

44154423
// Upgrade branch protection and return address signing module flags. The
44164424
// module flag behavior for these fields were Error and now they are Min.

llvm/lib/IR/Module.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,9 @@ PICLevel::Level Module::getPICLevel() const {
596596
}
597597

598598
void Module::setPICLevel(PICLevel::Level PL) {
599-
addModuleFlag(ModFlagBehavior::Max, "PIC Level", PL);
599+
// The merge result of a non-PIC object and a PIC object can only be reliably
600+
// used as a non-PIC object, so use the Min merge behavior.
601+
addModuleFlag(ModFlagBehavior::Min, "PIC Level", PL);
600602
}
601603

602604
PIELevel::Level Module::getPIELevel() const {

llvm/test/Bitcode/upgrade-module-flag.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
!2 = !{i32 1, !"Objective-C Image Info Version", i32 0}
99
!3 = !{i32 1, !"Objective-C Image Info Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"}
1010

11-
; CHECK: !0 = !{i32 7, !"PIC Level", i32 1}
11+
; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}
1212
; CHECK: !1 = !{i32 7, !"PIE Level", i32 1}
1313
; CHECK: !2 = !{i32 1, !"Objective-C Image Info Version", i32 0}
1414
; CHECK: !3 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"}
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
2+
; RUN: verify-uselistorder < %s
3+
4+
!llvm.module.flags = !{!0}
5+
6+
; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}
7+
8+
!0 = !{i32 7, !"PIC Level", i32 1}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
!0 = !{ i32 7, !"PIC Level", i32 2 }
1+
!0 = !{ i32 8, !"PIC Level", i32 2 }
22
!1 = !{ i32 7, !"PIE Level", i32 2 }
33

44
!llvm.module.flags = !{!0, !1}

llvm/test/Linker/module-flags-pic-1-a.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66

77
!llvm.module.flags = !{!0}
88
; CHECK: !llvm.module.flags = !{!0}
9-
; CHECK: !0 = !{i32 7, !"PIC Level", i32 1}
9+
; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}

llvm/test/Linker/module-flags-pic-2-a.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
; test linking modules with two different PIC and PIE levels
44

5-
!0 = !{ i32 7, !"PIC Level", i32 1 }
5+
!0 = !{ i32 8, !"PIC Level", i32 1 }
66
!1 = !{ i32 7, !"PIE Level", i32 1 }
77

88
!llvm.module.flags = !{!0, !1}
99

10-
; CHECK: !0 = !{i32 7, !"PIC Level", i32 2}
10+
; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}
1111
; CHECK: !1 = !{i32 7, !"PIE Level", i32 2}

llvm/test/Transforms/Attributor/value-simplify-dbg.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ declare i32 @speculatable() speculatable readnone
5858
!7 = !{i32 7, !"Dwarf Version", i32 5}
5959
!8 = !{i32 2, !"Debug Info Version", i32 3}
6060
!9 = !{i32 1, !"wchar_size", i32 4}
61-
!10 = !{i32 7, !"PIC Level", i32 2}
61+
!10 = !{i32 8, !"PIC Level", i32 2}
6262
!11 = !{i32 7, !"PIE Level", i32 2}
6363
!12 = !{i32 7, !"uwtable", i32 2}
6464
!13 = !{i32 7, !"frame-pointer", i32 2}
@@ -88,7 +88,7 @@ declare i32 @speculatable() speculatable readnone
8888
; CHECK: [[META7:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 5}
8989
; CHECK: [[META8:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
9090
; CHECK: [[META9:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
91-
; CHECK: [[META10:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
91+
; CHECK: [[META10:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
9292
; CHECK: [[META11:![0-9]+]] = !{i32 7, !"PIE Level", i32 2}
9393
; CHECK: [[META12:![0-9]+]] = !{i32 7, !"uwtable", i32 2}
9494
; CHECK: [[META13:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}

llvm/test/Transforms/Attributor/value-simplify-local-remote.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ entry:
769769
!1 = !{i32 1, !"wchar_size", i32 4}
770770
!2 = !{i32 7, !"openmp", i32 50}
771771
!3 = !{i32 7, !"openmp-device", i32 50}
772-
!4 = !{i32 7, !"PIC Level", i32 2}
772+
!4 = !{i32 8, !"PIC Level", i32 2}
773773
!5 = !{i32 7, !"frame-pointer", i32 2}
774774
!6 = !{i32 7, !"Dwarf Version", i32 2}
775775
!7 = !{i32 2, !"Debug Info Version", i32 3}
@@ -795,7 +795,7 @@ entry:
795795
; CHECK: [[META1:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
796796
; CHECK: [[META2:![0-9]+]] = !{i32 7, !"openmp", i32 50}
797797
; CHECK: [[META3:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
798-
; CHECK: [[META4:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
798+
; CHECK: [[META4:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
799799
; CHECK: [[META5:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
800800
; CHECK: [[META6:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 2}
801801
; CHECK: [[META7:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}

llvm/test/Transforms/OpenMP/spmdization.ll

+5-5
Original file line numberDiff line numberDiff line change
@@ -2395,7 +2395,7 @@ attributes #11 = { convergent }
23952395
!12 = !{i32 1, !"wchar_size", i32 4}
23962396
!13 = !{i32 7, !"openmp", i32 50}
23972397
!14 = !{i32 7, !"openmp-device", i32 50}
2398-
!15 = !{i32 7, !"PIC Level", i32 2}
2398+
!15 = !{i32 8, !"PIC Level", i32 2}
23992399
!16 = !{i32 7, !"frame-pointer", i32 2}
24002400
!17 = !{!"clang version 14.0.0"}
24012401
!18 = !{!19, !19, i64 0}
@@ -2481,7 +2481,7 @@ attributes #11 = { convergent }
24812481
; AMDGPU: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
24822482
; AMDGPU: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
24832483
; AMDGPU: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
2484-
; AMDGPU: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
2484+
; AMDGPU: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
24852485
; AMDGPU: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
24862486
; AMDGPU: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
24872487
; AMDGPU: [[TBAA18]] = !{!19, !19, i64 0}
@@ -2515,7 +2515,7 @@ attributes #11 = { convergent }
25152515
; NVPTX: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
25162516
; NVPTX: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
25172517
; NVPTX: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
2518-
; NVPTX: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
2518+
; NVPTX: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
25192519
; NVPTX: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
25202520
; NVPTX: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
25212521
; NVPTX: [[TBAA18]] = !{!19, !19, i64 0}
@@ -2549,7 +2549,7 @@ attributes #11 = { convergent }
25492549
; AMDGPU-DISABLED: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
25502550
; AMDGPU-DISABLED: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
25512551
; AMDGPU-DISABLED: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
2552-
; AMDGPU-DISABLED: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
2552+
; AMDGPU-DISABLED: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
25532553
; AMDGPU-DISABLED: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
25542554
; AMDGPU-DISABLED: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
25552555
; AMDGPU-DISABLED: [[TBAA18]] = !{!19, !19, i64 0}
@@ -2583,7 +2583,7 @@ attributes #11 = { convergent }
25832583
; NVPTX-DISABLED: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
25842584
; NVPTX-DISABLED: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
25852585
; NVPTX-DISABLED: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
2586-
; NVPTX-DISABLED: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
2586+
; NVPTX-DISABLED: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
25872587
; NVPTX-DISABLED: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
25882588
; NVPTX-DISABLED: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
25892589
; NVPTX-DISABLED: [[TBAA18]] = !{!19, !19, i64 0}

llvm/test/Transforms/OpenMP/spmdization_assumes.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ attributes #6 = { convergent nounwind "llvm.assume"="ompx_spmd_amenable" }
137137
!2 = !{i32 1, !"wchar_size", i32 4}
138138
!3 = !{i32 7, !"openmp", i32 50}
139139
!4 = !{i32 7, !"openmp-device", i32 50}
140-
!5 = !{i32 7, !"PIC Level", i32 2}
140+
!5 = !{i32 8, !"PIC Level", i32 2}
141141
!6 = !{i32 7, !"frame-pointer", i32 2}
142142
!7 = !{!"clang version 14.0.0"}
143143
!8 = !{!9, !9, i64 0}
@@ -159,7 +159,7 @@ attributes #6 = { convergent nounwind "llvm.assume"="ompx_spmd_amenable" }
159159
; CHECK: [[META2:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
160160
; CHECK: [[META3:![0-9]+]] = !{i32 7, !"openmp", i32 50}
161161
; CHECK: [[META4:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
162-
; CHECK: [[META5:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
162+
; CHECK: [[META5:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
163163
; CHECK: [[META6:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
164164
; CHECK: [[META7:![0-9]+]] = !{!"clang version 14.0.0"}
165165
; CHECK: [[TBAA8]] = !{!9, !9, i64 0}

llvm/test/Transforms/OpenMP/spmdization_guarding.ll

+3-3
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame
381381
!2 = !{i32 1, !"wchar_size", i32 4}
382382
!3 = !{i32 7, !"openmp", i32 50}
383383
!4 = !{i32 7, !"openmp-device", i32 50}
384-
!5 = !{i32 7, !"PIC Level", i32 2}
384+
!5 = !{i32 8, !"PIC Level", i32 2}
385385
!6 = !{i32 7, !"frame-pointer", i32 2}
386386
!7 = !{!"clang version 14.0.0"}
387387
!8 = !{!9}
@@ -419,7 +419,7 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame
419419
; CHECK: [[META2:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
420420
; CHECK: [[META3:![0-9]+]] = !{i32 7, !"openmp", i32 50}
421421
; CHECK: [[META4:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
422-
; CHECK: [[META5:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
422+
; CHECK: [[META5:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
423423
; CHECK: [[META6:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
424424
; CHECK: [[META7:![0-9]+]] = !{!"clang version 14.0.0"}
425425
; CHECK: [[META8:![0-9]+]] = !{!9}
@@ -433,7 +433,7 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame
433433
; CHECK-DISABLED: [[META2:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
434434
; CHECK-DISABLED: [[META3:![0-9]+]] = !{i32 7, !"openmp", i32 50}
435435
; CHECK-DISABLED: [[META4:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
436-
; CHECK-DISABLED: [[META5:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
436+
; CHECK-DISABLED: [[META5:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
437437
; CHECK-DISABLED: [[META6:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
438438
; CHECK-DISABLED: [[META7:![0-9]+]] = !{!"clang version 14.0.0"}
439439
; CHECK-DISABLED: [[META8:![0-9]+]] = !{!9}

llvm/test/Transforms/OpenMP/spmdization_guarding_two_reaching_kernels.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ attributes #5 = { convergent }
265265
!4 = !{i32 1, !"wchar_size", i32 4}
266266
!5 = !{i32 7, !"openmp", i32 50}
267267
!6 = !{i32 7, !"openmp-device", i32 50}
268-
!7 = !{i32 7, !"PIC Level", i32 2}
268+
!7 = !{i32 8, !"PIC Level", i32 2}
269269
!8 = !{i32 7, !"frame-pointer", i32 2}
270270
!9 = !{!"clang version 14.0.0"}
271271
;.
@@ -285,7 +285,7 @@ attributes #5 = { convergent }
285285
; CHECK: [[META4:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
286286
; CHECK: [[META5:![0-9]+]] = !{i32 7, !"openmp", i32 50}
287287
; CHECK: [[META6:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
288-
; CHECK: [[META7:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
288+
; CHECK: [[META7:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
289289
; CHECK: [[META8:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
290290
; CHECK: [[META9:![0-9]+]] = !{!"clang version 14.0.0"}
291291
;.

0 commit comments

Comments
 (0)