Skip to content

Commit 6388ec1

Browse files
committed
[LLVM][C API] Support Value extraction from a MetadataAsValue.
It is already possible to extract the underlying Metadata from a ValueAsMetadata.
1 parent 9d36428 commit 6388ec1

File tree

5 files changed

+33
-3
lines changed

5 files changed

+33
-3
lines changed

llvm/lib/IR/Core.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,8 +1328,12 @@ LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) {
13281328
return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count);
13291329
}
13301330

1331-
LLVMValueRef LLVMMetadataAsValue(LLVMContextRef C, LLVMMetadataRef MD) {
1332-
return wrap(MetadataAsValue::get(*unwrap(C), unwrap(MD)));
1331+
LLVMValueRef LLVMMetadataAsValue(LLVMContextRef C, LLVMMetadataRef Metadata) {
1332+
auto *MD = unwrap(Metadata);
1333+
if (auto *VAM = dyn_cast<ValueAsMetadata>(MD))
1334+
return wrap(VAM->getValue());
1335+
else
1336+
return wrap(MetadataAsValue::get(*unwrap(C), MD));
13331337
}
13341338

13351339
LLVMMetadataRef LLVMValueAsMetadata(LLVMValueRef Val) {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
; RUN: llvm-c-test --vam-mav-extract < /dev/null
2+
; This used to trigger an assertion

llvm/tools/llvm-c-test/llvm-c-test.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ int llvm_add_named_metadata_operand(void);
4545
int llvm_set_metadata(void);
4646
int llvm_replace_md_operand(void);
4747
int llvm_is_a_value_as_metadata(void);
48+
int llvm_vam_mav_extract(void);
4849

4950
// object.c
5051
int llvm_object_list_sections(void);

llvm/tools/llvm-c-test/main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ static void print_usage(void) {
5656
fprintf(stderr, " * --is-a-value-as-metadata\n");
5757
fprintf(stderr,
5858
" Run test for checking if LLVMValueRef is a ValueAsMetadata\n");
59+
fprintf(stderr, " * --vam-mav-extract\n");
60+
fprintf(stderr, " Run test for extracting data from ValueAsMetadata and "
61+
"MetadataAsValue\n");
5962
fprintf(stderr, " * --echo\n");
6063
fprintf(stderr, " Read bitcode file from stdin - print it back out\n\n");
6164
fprintf(stderr, " * --test-diagnostic-handler\n");
@@ -101,6 +104,8 @@ int main(int argc, char **argv) {
101104
return llvm_replace_md_operand();
102105
} else if (argc == 2 && !strcmp(argv[1], "--is-a-value-as-metadata")) {
103106
return llvm_is_a_value_as_metadata();
107+
} else if (argc == 2 && !strcmp(argv[1], "--vam-mav-extract")) {
108+
return llvm_vam_mav_extract();
104109
} else if (argc == 2 && !strcmp(argv[1], "--test-function-attributes")) {
105110
return llvm_test_function_attributes();
106111
} else if (argc == 2 && !strcmp(argv[1], "--test-callsite-attributes")) {

llvm/tools/llvm-c-test/metadata.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ int llvm_is_a_value_as_metadata(void) {
8080
LLVMContextRef Context = LLVMGetModuleContext(M);
8181

8282
{
83-
LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0);
83+
LLVMValueRef Int = LLVMConstInt(LLVMInt32TypeInContext(Context), 0, 0);
8484
LLVMValueRef NodeMD = LLVMMDNode(&Int, 1);
8585
assert(LLVMIsAValueAsMetadata(NodeMD) == NodeMD);
8686
(void)NodeMD;
@@ -98,3 +98,21 @@ int llvm_is_a_value_as_metadata(void) {
9898

9999
return 0;
100100
}
101+
102+
int llvm_vam_mav_extract(void) {
103+
LLVMModuleRef M = LLVMModuleCreateWithName("Mod");
104+
LLVMContextRef Context = LLVMGetModuleContext(M);
105+
106+
LLVMValueRef Val = LLVMConstInt(LLVMInt32TypeInContext(Context), 0, 0);
107+
LLVMMetadataRef MD = LLVMMDStringInContext2(Context, "foo", 3);
108+
109+
// construction
110+
LLVMValueRef MAV = LLVMMetadataAsValue(Context, MD);
111+
LLVMMetadataRef VAM = LLVMValueAsMetadata(Val);
112+
113+
// extraction
114+
assert(LLVMMetadataAsValue(Context, VAM) == Val);
115+
assert(LLVMValueAsMetadata(MAV) == MD);
116+
117+
return 0;
118+
}

0 commit comments

Comments
 (0)