diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 0fa97c55687..00bb55e9531 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -395,14 +395,8 @@ static Value *RemapOperand(const Value *In, assert(!isa(CPV) && "Unmapped global?"); llvm_unreachable("Unknown type of derived type constant value!"); } - } else if (const MDNode *N = dyn_cast(In)) { - std::vector Elems; - for (unsigned i = 0, e = N->getNumElements(); i !=e; ++i) - Elems.push_back(RemapOperand(N->getElement(i), ValueMap, Context)); - if (!Elems.empty()) - Result = MDNode::get(Context, &Elems[0], Elems.size()); - } else if (const MDString *MDS = dyn_cast(In)) { - Result = MDString::get(Context, MDS->getString()); + } else if (isa(In)) { + Result = const_cast(In); } else if (isa(In)) { Result = const_cast(In); } diff --git a/test/Linker/2009-09-03-mdnode.ll b/test/Linker/2009-09-03-mdnode.ll new file mode 100644 index 00000000000..11862f70b29 --- /dev/null +++ b/test/Linker/2009-09-03-mdnode.ll @@ -0,0 +1,30 @@ +; RUN: llvm-as < %s > %t.bc +; RUN: llvm-as < %p/2009-09-03-mdnode2.ll > %t2.bc +; RUN: llvm-link %t.bc %t2.bc + +declare void @f() nounwind + +define i32 @main(...) nounwind { +entry: + %retval = alloca i32 ; [#uses=2] + call void @llvm.dbg.func.start(metadata !0) + store i32 0, i32* %retval + call void @llvm.dbg.stoppoint(i32 4, i32 5, metadata !1) + call void @f() + br label %return + +return: ; preds = %entry + %0 = load i32* %retval ; [#uses=1] + call void @llvm.dbg.stoppoint(i32 5, i32 1, metadata !1) + call void @llvm.dbg.region.end(metadata !0) + ret i32 %0 +} + +declare void @llvm.dbg.func.start(metadata) nounwind readnone + +declare void @llvm.dbg.stoppoint(i32, i32, metadata) nounwind readnone + +declare void @llvm.dbg.region.end(metadata) nounwind readnone + +!0 = metadata !{i32 458798, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 2, null, i1 false, i1 true} +!1 = metadata !{i32 458769, i32 0, i32 12, metadata !"a.c", metadata !"/home/rich/ellcc/test/source", metadata !"ellcc 0.1.0", i1 true, i1 true, metadata !"", i32 0} diff --git a/test/Linker/2009-09-03-mdnode2.ll b/test/Linker/2009-09-03-mdnode2.ll new file mode 100644 index 00000000000..21589a49b79 --- /dev/null +++ b/test/Linker/2009-09-03-mdnode2.ll @@ -0,0 +1,25 @@ +; This file is used by 2009-09-03-mdnode.ll, so it doesn't actually do anything itself +; +; RUN: true + +define i32 @f(...) nounwind { +entry: + %retval = alloca i32 ; [#uses=1] + call void @llvm.dbg.func.start(metadata !0) + br label %return + +return: ; preds = %entry + %0 = load i32* %retval ; [#uses=1] + call void @llvm.dbg.stoppoint(i32 3, i32 1, metadata !1) + call void @llvm.dbg.region.end(metadata !0) + ret i32 %0 +} + +declare void @llvm.dbg.func.start(metadata) nounwind readnone + +declare void @llvm.dbg.stoppoint(i32, i32, metadata) nounwind readnone + +declare void @llvm.dbg.region.end(metadata) nounwind readnone + +!0 = metadata !{i32 458798, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"f", metadata !1, i32 1, null, i1 false, i1 true} +!1 = metadata !{i32 458769, i32 0, i32 12, metadata !"b.c", metadata !"/home/rich/ellcc/test/source", metadata !"ellcc 0.1.0", i1 true, i1 true, metadata !"", i32 0}