mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-01 21:04:04 -04:00
[IR] AutoUpgrade ModuleFlagBehavior for PIC and PIE level
Summary: From r303590, ModuleFlagBehavior for PIC and PIE level is changed from Error to Max. This will cause bitcode compatibility issue when linking against a bitcode static archive built with old compiler. Add an auto-ugprade path to upgrade the the ModuleFlagBehavior in the old bitcode to match the new one so IRLinker can link them. Reviewers: tejohnson, mehdi_amini, dexonsmith Reviewed By: dexonsmith Subscribers: hans, llvm-commits Differential Revision: https://reviews.llvm.org/D36556 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311387 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+23
-5
@@ -2284,14 +2284,14 @@ bool llvm::UpgradeDebugInfo(Module &M) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool llvm::UpgradeModuleFlags(Module &M) {
|
bool llvm::UpgradeModuleFlags(Module &M) {
|
||||||
const NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
|
NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
|
||||||
if (!ModFlags)
|
if (!ModFlags)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool HasObjCFlag = false, HasClassProperties = false;
|
bool HasObjCFlag = false, HasClassProperties = false, Changed = false;
|
||||||
for (unsigned I = 0, E = ModFlags->getNumOperands(); I != E; ++I) {
|
for (unsigned I = 0, E = ModFlags->getNumOperands(); I != E; ++I) {
|
||||||
MDNode *Op = ModFlags->getOperand(I);
|
MDNode *Op = ModFlags->getOperand(I);
|
||||||
if (Op->getNumOperands() < 2)
|
if (Op->getNumOperands() != 3)
|
||||||
continue;
|
continue;
|
||||||
MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(1));
|
MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(1));
|
||||||
if (!ID)
|
if (!ID)
|
||||||
@@ -2300,7 +2300,24 @@ bool llvm::UpgradeModuleFlags(Module &M) {
|
|||||||
HasObjCFlag = true;
|
HasObjCFlag = true;
|
||||||
if (ID->getString() == "Objective-C Class Properties")
|
if (ID->getString() == "Objective-C Class Properties")
|
||||||
HasClassProperties = true;
|
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) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// "Objective-C Class Properties" is recently added for Objective-C. We
|
// "Objective-C Class Properties" is recently added for Objective-C. We
|
||||||
// upgrade ObjC bitcodes to contain a "Objective-C Class Properties" module
|
// upgrade ObjC bitcodes to contain a "Objective-C Class Properties" module
|
||||||
// flag of value 0, so we can correclty downgrade this flag when trying to
|
// flag of value 0, so we can correclty downgrade this flag when trying to
|
||||||
@@ -2309,9 +2326,10 @@ bool llvm::UpgradeModuleFlags(Module &M) {
|
|||||||
if (HasObjCFlag && !HasClassProperties) {
|
if (HasObjCFlag && !HasClassProperties) {
|
||||||
M.addModuleFlag(llvm::Module::Override, "Objective-C Class Properties",
|
M.addModuleFlag(llvm::Module::Override, "Objective-C Class Properties",
|
||||||
(uint32_t)0);
|
(uint32_t)0);
|
||||||
return true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
return Changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isOldLoopArgument(Metadata *MD) {
|
static bool isOldLoopArgument(Metadata *MD) {
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
||||||
; RUN: verify-uselistorder < %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: !0 = !{i32 7, !"PIC Level", i32 1}
|
||||||
; CHECK: !1 = !{i32 4, !"Objective-C Class Properties", i32 0}
|
; 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}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
; test linking modules with specified and default PIC levels
|
; 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}
|
!llvm.module.flags = !{!0}
|
||||||
; CHECK: !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}
|
||||||
|
|||||||
Reference in New Issue
Block a user