diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index 7665385025bd9..f4708bc18b3f8 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -1328,8 +1328,12 @@ LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) { return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count); } -LLVMValueRef LLVMMetadataAsValue(LLVMContextRef C, LLVMMetadataRef MD) { - return wrap(MetadataAsValue::get(*unwrap(C), unwrap(MD))); +LLVMValueRef LLVMMetadataAsValue(LLVMContextRef C, LLVMMetadataRef Metadata) { + auto *MD = unwrap(Metadata); + if (auto *VAM = dyn_cast(MD)) + return wrap(VAM->getValue()); + else + return wrap(MetadataAsValue::get(*unwrap(C), MD)); } LLVMMetadataRef LLVMValueAsMetadata(LLVMValueRef Val) { diff --git a/llvm/tools/llvm-c-test/metadata.c b/llvm/tools/llvm-c-test/metadata.c index 4fe8c00c57481..9031c6e4d7ce1 100644 --- a/llvm/tools/llvm-c-test/metadata.c +++ b/llvm/tools/llvm-c-test/metadata.c @@ -80,7 +80,7 @@ int llvm_is_a_value_as_metadata(void) { LLVMContextRef Context = LLVMGetModuleContext(M); { - LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0); + LLVMValueRef Int = LLVMConstInt(LLVMInt32TypeInContext(Context), 0, 0); LLVMValueRef NodeMD = LLVMMDNode(&Int, 1); assert(LLVMIsAValueAsMetadata(NodeMD) == NodeMD); (void)NodeMD; diff --git a/llvm/unittests/IR/MetadataTest.cpp b/llvm/unittests/IR/MetadataTest.cpp index 17573ca57e087..fdc16b4bb17fc 100644 --- a/llvm/unittests/IR/MetadataTest.cpp +++ b/llvm/unittests/IR/MetadataTest.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "llvm/IR/Metadata.h" +#include "llvm-c/Core.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/IR/Constants.h" @@ -404,6 +405,17 @@ TEST_F(MDNodeTest, PrintFromMetadataAsValue) { EXPECT_PRINTER_EQ("metadata !1", MAV1->printAsOperand(OS, true, MST)); } +TEST_F(MDNodeTest, ExtractFromValueOrMetadataWrappers) { + LLVMValueRef Val = LLVMConstInt(LLVMInt32TypeInContext(wrap(&Context)), 0, 0); + LLVMMetadataRef MD = LLVMMDStringInContext2(wrap(&Context), "foo", 3); + + LLVMValueRef MAV = LLVMMetadataAsValue(wrap(&Context), MD); + LLVMMetadataRef VAM = LLVMValueAsMetadata(Val); + + EXPECT_EQ(LLVMMetadataAsValue(wrap(&Context), VAM), Val); + EXPECT_EQ(LLVMValueAsMetadata(MAV), MD); +} + TEST_F(MDNodeTest, PrintWithDroppedCallOperand) { Module M("test", Context);