forked from OSchip/llvm-project
Copy Elementtype Attribute to IR at Link step
Copying IR during linking causes a type mismatch due to the field being missing in IRMover/Valuemapper. Adds the full range of typed attributes including elementtype attribute in the copy functions. Patch by Chenyang Liu Differential Revision: https://reviews.llvm.org/D108796
This commit is contained in:
parent
abd80ecf6e
commit
34528c32d2
|
@ -649,9 +649,9 @@ GlobalVariable *IRLinker::copyGlobalVariableProto(const GlobalVariable *SGVar) {
|
|||
|
||||
AttributeList IRLinker::mapAttributeTypes(LLVMContext &C, AttributeList Attrs) {
|
||||
for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
|
||||
for (Attribute::AttrKind TypedAttr :
|
||||
{Attribute::ByVal, Attribute::StructRet, Attribute::ByRef,
|
||||
Attribute::InAlloca}) {
|
||||
for (int AttrIdx = Attribute::FirstTypeAttr;
|
||||
AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
|
||||
Attribute::AttrKind TypedAttr = (Attribute::AttrKind)AttrIdx;
|
||||
if (Attrs.hasAttributeAtIndex(i, TypedAttr)) {
|
||||
if (Type *Ty =
|
||||
Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
|
||||
|
|
|
@ -944,9 +944,9 @@ void Mapper::remapInstruction(Instruction *I) {
|
|||
LLVMContext &C = CB->getContext();
|
||||
AttributeList Attrs = CB->getAttributes();
|
||||
for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
|
||||
for (Attribute::AttrKind TypedAttr :
|
||||
{Attribute::ByVal, Attribute::StructRet, Attribute::ByRef,
|
||||
Attribute::InAlloca}) {
|
||||
for (int AttrIdx = Attribute::FirstTypeAttr;
|
||||
AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
|
||||
Attribute::AttrKind TypedAttr = (Attribute::AttrKind)AttrIdx;
|
||||
if (Type *Ty =
|
||||
Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
|
||||
Attrs = Attrs.replaceAttributeTypeAtIndex(C, i, TypedAttr,
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
%struct = type {i32, i8}
|
||||
|
||||
define void @struct_elementtype_2() {
|
||||
call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct*, i32, i32)
|
|
@ -0,0 +1,17 @@
|
|||
; RUN: llvm-link %S/Inputs/elementtype-struct-2.ll %s -S | FileCheck %s
|
||||
|
||||
; Check that the attribute for elementtype matches when linking.
|
||||
|
||||
; CHECK: define void @struct_elementtype_2
|
||||
; CHECK: call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)
|
||||
; CHECK: define void @struct_elementtype
|
||||
; CHECK: call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)
|
||||
|
||||
%struct = type {i32, i8}
|
||||
|
||||
define void @struct_elementtype() {
|
||||
call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct*, i32, i32)
|
Loading…
Reference in New Issue