[PATCH] D36556: [IR] AutoUpgrade ModuleFlagBehavior for PIC and PIE level
Steven Wu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 18 14:58:17 PDT 2017
steven_wu updated this revision to Diff 111754.
steven_wu added a comment.
Here is a version that rebuilds the module flags to avoid replaceOperandsWith.
https://reviews.llvm.org/D36556
Files:
lib/IR/AutoUpgrade.cpp
test/Bitcode/upgrade-module-flag.ll
test/Linker/module-flags-pic-1-a.ll
Index: test/Linker/module-flags-pic-1-a.ll
===================================================================
--- test/Linker/module-flags-pic-1-a.ll
+++ test/Linker/module-flags-pic-1-a.ll
@@ -2,8 +2,8 @@
; test linking modules with specified and default PIC levels
-!0 = !{ i32 1, !"PIC Level", i32 1 }
+!0 = !{ i32 7, !"PIC Level", i32 1 }
!llvm.module.flags = !{!0}
; CHECK: !llvm.module.flags = !{!0}
-; CHECK: !0 = !{i32 1, !"PIC Level", i32 1}
+; CHECK: !0 = !{i32 7, !"PIC Level", i32 1}
Index: test/Bitcode/upgrade-module-flag.ll
===================================================================
--- test/Bitcode/upgrade-module-flag.ll
+++ test/Bitcode/upgrade-module-flag.ll
@@ -1,9 +1,13 @@
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
; RUN: verify-uselistorder < %s
-!llvm.module.flags = !{!0}
+!llvm.module.flags = !{!0, !1, !2}
-!0 = !{i32 1, !"Objective-C Image Info Version", i32 0}
+!0 = !{i32 1, !"PIC Level", i32 1}
+!1 = !{i32 1, !"PIE Level", i32 1}
+!2 = !{i32 1, !"Objective-C Image Info Version", i32 0}
-; CHECK: !0 = !{i32 1, !"Objective-C Image Info Version", i32 0}
-; CHECK: !1 = !{i32 4, !"Objective-C Class Properties", i32 0}
+; CHECK: !0 = !{i32 7, !"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 4, !"Objective-C Class Properties", i32 0}
Index: lib/IR/AutoUpgrade.cpp
===================================================================
--- lib/IR/AutoUpgrade.cpp
+++ lib/IR/AutoUpgrade.cpp
@@ -2284,11 +2284,11 @@
}
bool llvm::UpgradeModuleFlags(Module &M) {
- const NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
+ NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
if (!ModFlags)
return false;
- bool HasObjCFlag = false, HasClassProperties = false;
+ bool HasObjCFlag = false, HasClassProperties = false, MFBUpdate = false;
for (unsigned I = 0, E = ModFlags->getNumOperands(); I != E; ++I) {
MDNode *Op = ModFlags->getOperand(I);
if (Op->getNumOperands() < 2)
@@ -2300,6 +2300,32 @@
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") {
+ if (auto *Behavior =
+ mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(0))) {
+ if (Behavior->getLimitedValue() == Module::Error)
+ MFBUpdate = true;
+ }
+ }
+ }
+ if (MFBUpdate) {
+ SmallVector<MDNode *, 4> Flags(ModFlags->op_begin(), ModFlags->op_end());
+ M.eraseNamedMetadata(ModFlags);
+ ModFlags = M.getOrInsertModuleFlagsMetadata();
+ for (auto *Op : Flags) {
+ if (Op->getNumOperands() == 3) {
+ if (MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(1))) {
+ if (ID->getString() == "PIC Level" ||
+ ID->getString() == "PIE Level") {
+ M.addModuleFlag(Module::Max, ID->getString(), Op->getOperand(2));
+ continue;
+ }
+ }
+ }
+ ModFlags->addOperand(Op);
+ }
}
// "Objective-C Class Properties" is recently added for Objective-C. We
// upgrade ObjC bitcodes to contain a "Objective-C Class Properties" module
@@ -2311,7 +2337,8 @@
(uint32_t)0);
return true;
}
- return false;
+
+ return MFBUpdate;
}
static bool isOldLoopArgument(Metadata *MD) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36556.111754.patch
Type: text/x-patch
Size: 3561 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170818/713d5b05/attachment.bin>
More information about the llvm-commits
mailing list