[IR] Use Min behavior for module flag "PIC Level"
authorFangrui Song <i@maskray.me>
Thu, 18 Aug 2022 23:28:55 +0000 (16:28 -0700)
committerFangrui Song <i@maskray.me>
Thu, 18 Aug 2022 23:28:55 +0000 (16:28 -0700)
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

14 files changed:
clang/test/CodeGen/piclevels.c
llvm/lib/IR/AutoUpgrade.cpp
llvm/lib/IR/Module.cpp
llvm/test/Bitcode/upgrade-module-flag.ll
llvm/test/Bitcode/upgrade-pic-level.ll [new file with mode: 0644]
llvm/test/Linker/Inputs/module-flags-pic-2-b.ll
llvm/test/Linker/module-flags-pic-1-a.ll
llvm/test/Linker/module-flags-pic-2-a.ll
llvm/test/Transforms/Attributor/value-simplify-dbg.ll
llvm/test/Transforms/Attributor/value-simplify-local-remote.ll
llvm/test/Transforms/OpenMP/spmdization.ll
llvm/test/Transforms/OpenMP/spmdization_assumes.ll
llvm/test/Transforms/OpenMP/spmdization_guarding.ll
llvm/test/Transforms/OpenMP/spmdization_guarding_two_reaching_kernels.ll

index f050af9..7127f04 100644 (file)
@@ -4,9 +4,9 @@
 // RUN: %clang_cc1 -emit-llvm -pic-level 1 -pic-is-pie %s -o - | FileCheck %s -check-prefix=CHECK-SMALLPIC -check-prefix=CHECK-SMALLPIE
 
 // CHECK-BIGPIC: !llvm.module.flags = !{{{.*}}}
-// CHECK-BIGPIC: !{{[0-9]+}} = !{i32 7, !"PIC Level", i32 2}
+// CHECK-BIGPIC: ![[#]] = !{i32 8, !"PIC Level", i32 2}
 // CHECK-SMALLPIC: !llvm.module.flags = !{{{.*}}}
-// CHECK-SMALLPIC: !{{[0-9]+}} = !{i32 7, !"PIC Level", i32 1}
+// CHECK-SMALLPIC: ![[#]] = !{i32 8, !"PIC Level", i32 1}
 // CHECK-NOPIE-NOT: PIE Level
-// CHECK-BIGPIE: !{{[0-9]+}} = !{i32 7, !"PIE Level", i32 2}
-// CHECK-SMALLPIE: !{{[0-9]+}} = !{i32 7, !"PIE Level", i32 1}
+// CHECK-BIGPIE: ![[#]] = !{i32 7, !"PIE Level", i32 2}
+// CHECK-SMALLPIE: ![[#]] = !{i32 7, !"PIE Level", i32 1}
index 75594f9..18ea2fd 100644 (file)
@@ -4391,26 +4391,34 @@ bool llvm::UpgradeModuleFlags(Module &M) {
     MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(1));
     if (!ID)
       continue;
+    auto SetBehavior = [&](Module::ModFlagBehavior B) {
+      Metadata *Ops[3] = {ConstantAsMetadata::get(ConstantInt::get(
+                              Type::getInt32Ty(M.getContext()), B)),
+                          MDString::get(M.getContext(), ID->getString()),
+                          Op->getOperand(2)};
+      ModFlags->setOperand(I, MDNode::get(M.getContext(), Ops));
+      Changed = true;
+    };
+
     if (ID->getString() == "Objective-C Image Info Version")
       HasObjCFlag = true;
     if (ID->getString() == "Objective-C Class Properties")
       HasClassProperties = true;
-    // Upgrade PIC/PIE Module Flags. The module flag behavior for these two
-    // field was Error and now they are Max.
-    if (ID->getString() == "PIC Level" || ID->getString() == "PIE Level") {
+    // Upgrade PIC from Error/Max to Min.
+    if (ID->getString() == "PIC Level") {
       if (auto *Behavior =
               mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(0))) {
-        if (Behavior->getLimitedValue() == Module::Error) {
-          Type *Int32Ty = Type::getInt32Ty(M.getContext());
-          Metadata *Ops[3] = {
-              ConstantAsMetadata::get(ConstantInt::get(Int32Ty, Module::Max)),
-              MDString::get(M.getContext(), ID->getString()),
-              Op->getOperand(2)};
-          ModFlags->setOperand(I, MDNode::get(M.getContext(), Ops));
-          Changed = true;
-        }
+        uint64_t V = Behavior->getLimitedValue();
+        if (V == Module::Error || V == Module::Max)
+          SetBehavior(Module::Min);
       }
     }
+    // Upgrade "PIE Level" from Error to Max.
+    if (ID->getString() == "PIE Level")
+      if (auto *Behavior =
+              mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(0)))
+        if (Behavior->getLimitedValue() == Module::Error)
+          SetBehavior(Module::Max);
 
     // Upgrade branch protection and return address signing module flags. The
     // module flag behavior for these fields were Error and now they are Min.
index b51ea45..5dd114c 100644 (file)
@@ -596,7 +596,9 @@ PICLevel::Level Module::getPICLevel() const {
 }
 
 void Module::setPICLevel(PICLevel::Level PL) {
-  addModuleFlag(ModFlagBehavior::Max, "PIC Level", PL);
+  // The merge result of a non-PIC object and a PIC object can only be reliably
+  // used as a non-PIC object, so use the Min merge behavior.
+  addModuleFlag(ModFlagBehavior::Min, "PIC Level", PL);
 }
 
 PIELevel::Level Module::getPIELevel() const {
index 539265b..1004fd8 100644 (file)
@@ -8,7 +8,7 @@
 !2 = !{i32 1, !"Objective-C Image Info Version", i32 0}
 !3 = !{i32 1, !"Objective-C Image Info Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"}
 
-; CHECK: !0 = !{i32 7, !"PIC Level", i32 1}
+; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}
 ; CHECK: !1 = !{i32 7, !"PIE Level", i32 1}
 ; CHECK: !2 = !{i32 1, !"Objective-C Image Info Version", i32 0}
 ; CHECK: !3 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"}
diff --git a/llvm/test/Bitcode/upgrade-pic-level.ll b/llvm/test/Bitcode/upgrade-pic-level.ll
new file mode 100644 (file)
index 0000000..55bd2d8
--- /dev/null
@@ -0,0 +1,8 @@
+; RUN: llvm-as < %s | llvm-dis | FileCheck %s
+; RUN: verify-uselistorder < %s
+
+!llvm.module.flags = !{!0}
+
+; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}
+
+!0 = !{i32 7, !"PIC Level", i32 1}
index f652edd..f84a1ec 100644 (file)
@@ -1,4 +1,4 @@
-!0 = !{ i32 7, !"PIC Level", i32 2 }
+!0 = !{ i32 8, !"PIC Level", i32 2 }
 !1 = !{ i32 7, !"PIE Level", i32 2 }
 
 !llvm.module.flags = !{!0, !1}
index 9074aa6..6a05a71 100644 (file)
@@ -6,4 +6,4 @@
 
 !llvm.module.flags = !{!0}
 ; CHECK: !llvm.module.flags = !{!0}
-; CHECK: !0 = !{i32 7, !"PIC Level", i32 1}
+; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}
index 8898d72..ac67437 100644 (file)
@@ -2,10 +2,10 @@
 
 ; test linking modules with two different PIC and PIE levels
 
-!0 = !{ i32 7, !"PIC Level", i32 1 }
+!0 = !{ i32 8, !"PIC Level", i32 1 }
 !1 = !{ i32 7, !"PIE Level", i32 1 }
 
 !llvm.module.flags = !{!0, !1}
 
-; CHECK: !0 = !{i32 7, !"PIC Level", i32 2}
+; CHECK: !0 = !{i32 8, !"PIC Level", i32 1}
 ; CHECK: !1 = !{i32 7, !"PIE Level", i32 2}
index 527677d..cf41d10 100644 (file)
@@ -58,7 +58,7 @@ declare i32 @speculatable() speculatable readnone
 !7 = !{i32 7, !"Dwarf Version", i32 5}
 !8 = !{i32 2, !"Debug Info Version", i32 3}
 !9 = !{i32 1, !"wchar_size", i32 4}
-!10 = !{i32 7, !"PIC Level", i32 2}
+!10 = !{i32 8, !"PIC Level", i32 2}
 !11 = !{i32 7, !"PIE Level", i32 2}
 !12 = !{i32 7, !"uwtable", i32 2}
 !13 = !{i32 7, !"frame-pointer", i32 2}
@@ -88,7 +88,7 @@ declare i32 @speculatable() speculatable readnone
 ; CHECK: [[META7:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 5}
 ; CHECK: [[META8:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
 ; CHECK: [[META9:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
-; CHECK: [[META10:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; CHECK: [[META10:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; CHECK: [[META11:![0-9]+]] = !{i32 7, !"PIE Level", i32 2}
 ; CHECK: [[META12:![0-9]+]] = !{i32 7, !"uwtable", i32 2}
 ; CHECK: [[META13:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
index ec0e6c5..3a67f0c 100644 (file)
@@ -769,7 +769,7 @@ entry:
 !1 = !{i32 1, !"wchar_size", i32 4}
 !2 = !{i32 7, !"openmp", i32 50}
 !3 = !{i32 7, !"openmp-device", i32 50}
-!4 = !{i32 7, !"PIC Level", i32 2}
+!4 = !{i32 8, !"PIC Level", i32 2}
 !5 = !{i32 7, !"frame-pointer", i32 2}
 !6 = !{i32 7, !"Dwarf Version", i32 2}
 !7 = !{i32 2, !"Debug Info Version", i32 3}
@@ -795,7 +795,7 @@ entry:
 ; CHECK: [[META1:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; CHECK: [[META2:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; CHECK: [[META3:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; CHECK: [[META4:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; CHECK: [[META4:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; CHECK: [[META5:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; CHECK: [[META6:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 2}
 ; CHECK: [[META7:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
index d6f7c7d..5f45d62 100644 (file)
@@ -2395,7 +2395,7 @@ attributes #11 = { convergent }
 !12 = !{i32 1, !"wchar_size", i32 4}
 !13 = !{i32 7, !"openmp", i32 50}
 !14 = !{i32 7, !"openmp-device", i32 50}
-!15 = !{i32 7, !"PIC Level", i32 2}
+!15 = !{i32 8, !"PIC Level", i32 2}
 !16 = !{i32 7, !"frame-pointer", i32 2}
 !17 = !{!"clang version 14.0.0"}
 !18 = !{!19, !19, i64 0}
@@ -2481,7 +2481,7 @@ attributes #11 = { convergent }
 ; AMDGPU: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; AMDGPU: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; AMDGPU: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; AMDGPU: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; AMDGPU: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; AMDGPU: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; AMDGPU: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
 ; AMDGPU: [[TBAA18]] = !{!19, !19, i64 0}
@@ -2515,7 +2515,7 @@ attributes #11 = { convergent }
 ; NVPTX: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; NVPTX: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; NVPTX: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; NVPTX: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; NVPTX: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; NVPTX: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; NVPTX: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
 ; NVPTX: [[TBAA18]] = !{!19, !19, i64 0}
@@ -2549,7 +2549,7 @@ attributes #11 = { convergent }
 ; AMDGPU-DISABLED: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; AMDGPU-DISABLED: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; AMDGPU-DISABLED: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; AMDGPU-DISABLED: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; AMDGPU-DISABLED: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; AMDGPU-DISABLED: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; AMDGPU-DISABLED: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
 ; AMDGPU-DISABLED: [[TBAA18]] = !{!19, !19, i64 0}
@@ -2583,7 +2583,7 @@ attributes #11 = { convergent }
 ; NVPTX-DISABLED: [[META12:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; NVPTX-DISABLED: [[META13:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; NVPTX-DISABLED: [[META14:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; NVPTX-DISABLED: [[META15:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; NVPTX-DISABLED: [[META15:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; NVPTX-DISABLED: [[META16:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; NVPTX-DISABLED: [[META17:![0-9]+]] = !{!"clang version 14.0.0"}
 ; NVPTX-DISABLED: [[TBAA18]] = !{!19, !19, i64 0}
index 93065a2..6c7fcd3 100644 (file)
@@ -137,7 +137,7 @@ attributes #6 = { convergent nounwind "llvm.assume"="ompx_spmd_amenable" }
 !2 = !{i32 1, !"wchar_size", i32 4}
 !3 = !{i32 7, !"openmp", i32 50}
 !4 = !{i32 7, !"openmp-device", i32 50}
-!5 = !{i32 7, !"PIC Level", i32 2}
+!5 = !{i32 8, !"PIC Level", i32 2}
 !6 = !{i32 7, !"frame-pointer", i32 2}
 !7 = !{!"clang version 14.0.0"}
 !8 = !{!9, !9, i64 0}
@@ -159,7 +159,7 @@ attributes #6 = { convergent nounwind "llvm.assume"="ompx_spmd_amenable" }
 ; CHECK: [[META2:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; CHECK: [[META3:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; CHECK: [[META4:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; CHECK: [[META5:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; CHECK: [[META5:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; CHECK: [[META6:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; CHECK: [[META7:![0-9]+]] = !{!"clang version 14.0.0"}
 ; CHECK: [[TBAA8]] = !{!9, !9, i64 0}
index e8922ab..4eb6347 100644 (file)
@@ -381,7 +381,7 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame
 !2 = !{i32 1, !"wchar_size", i32 4}
 !3 = !{i32 7, !"openmp", i32 50}
 !4 = !{i32 7, !"openmp-device", i32 50}
-!5 = !{i32 7, !"PIC Level", i32 2}
+!5 = !{i32 8, !"PIC Level", i32 2}
 !6 = !{i32 7, !"frame-pointer", i32 2}
 !7 = !{!"clang version 14.0.0"}
 !8 = !{!9}
@@ -419,7 +419,7 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame
 ; CHECK: [[META2:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; CHECK: [[META3:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; CHECK: [[META4:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; CHECK: [[META5:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; CHECK: [[META5:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; CHECK: [[META6:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; CHECK: [[META7:![0-9]+]] = !{!"clang version 14.0.0"}
 ; CHECK: [[META8:![0-9]+]] = !{!9}
@@ -433,7 +433,7 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame
 ; CHECK-DISABLED: [[META2:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; CHECK-DISABLED: [[META3:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; CHECK-DISABLED: [[META4:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; CHECK-DISABLED: [[META5:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; CHECK-DISABLED: [[META5:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; CHECK-DISABLED: [[META6:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; CHECK-DISABLED: [[META7:![0-9]+]] = !{!"clang version 14.0.0"}
 ; CHECK-DISABLED: [[META8:![0-9]+]] = !{!9}
index f56c885..c94528c 100644 (file)
@@ -265,7 +265,7 @@ attributes #5 = { convergent }
 !4 = !{i32 1, !"wchar_size", i32 4}
 !5 = !{i32 7, !"openmp", i32 50}
 !6 = !{i32 7, !"openmp-device", i32 50}
-!7 = !{i32 7, !"PIC Level", i32 2}
+!7 = !{i32 8, !"PIC Level", i32 2}
 !8 = !{i32 7, !"frame-pointer", i32 2}
 !9 = !{!"clang version 14.0.0"}
 ;.
@@ -285,7 +285,7 @@ attributes #5 = { convergent }
 ; CHECK: [[META4:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
 ; CHECK: [[META5:![0-9]+]] = !{i32 7, !"openmp", i32 50}
 ; CHECK: [[META6:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; CHECK: [[META7:![0-9]+]] = !{i32 7, !"PIC Level", i32 2}
+; CHECK: [[META7:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
 ; CHECK: [[META8:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
 ; CHECK: [[META9:![0-9]+]] = !{!"clang version 14.0.0"}
 ;.