File tree Expand file tree Collapse file tree 5 files changed +33
-3
lines changed Expand file tree Collapse file tree 5 files changed +33
-3
lines changed Original file line number Diff line number Diff line change @@ -1328,8 +1328,12 @@ LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) {
1328
1328
return LLVMMDNodeInContext (LLVMGetGlobalContext (), Vals, Count);
1329
1329
}
1330
1330
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));
1333
1337
}
1334
1338
1335
1339
LLVMMetadataRef LLVMValueAsMetadata (LLVMValueRef Val) {
Original file line number Diff line number Diff line change
1
+ ; RUN: llvm-c-test --vam-mav-extract < /dev/null
2
+ ; This used to trigger an assertion
Original file line number Diff line number Diff line change @@ -45,6 +45,7 @@ int llvm_add_named_metadata_operand(void);
45
45
int llvm_set_metadata (void );
46
46
int llvm_replace_md_operand (void );
47
47
int llvm_is_a_value_as_metadata (void );
48
+ int llvm_vam_mav_extract (void );
48
49
49
50
// object.c
50
51
int llvm_object_list_sections (void );
Original file line number Diff line number Diff line change @@ -56,6 +56,9 @@ static void print_usage(void) {
56
56
fprintf (stderr , " * --is-a-value-as-metadata\n" );
57
57
fprintf (stderr ,
58
58
" 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" );
59
62
fprintf (stderr , " * --echo\n" );
60
63
fprintf (stderr , " Read bitcode file from stdin - print it back out\n\n" );
61
64
fprintf (stderr , " * --test-diagnostic-handler\n" );
@@ -101,6 +104,8 @@ int main(int argc, char **argv) {
101
104
return llvm_replace_md_operand ();
102
105
} else if (argc == 2 && !strcmp (argv [1 ], "--is-a-value-as-metadata" )) {
103
106
return llvm_is_a_value_as_metadata ();
107
+ } else if (argc == 2 && !strcmp (argv [1 ], "--vam-mav-extract" )) {
108
+ return llvm_vam_mav_extract ();
104
109
} else if (argc == 2 && !strcmp (argv [1 ], "--test-function-attributes" )) {
105
110
return llvm_test_function_attributes ();
106
111
} else if (argc == 2 && !strcmp (argv [1 ], "--test-callsite-attributes" )) {
Original file line number Diff line number Diff line change @@ -80,7 +80,7 @@ int llvm_is_a_value_as_metadata(void) {
80
80
LLVMContextRef Context = LLVMGetModuleContext (M );
81
81
82
82
{
83
- LLVMValueRef Int = LLVMConstInt (LLVMInt32Type ( ), 0 , 0 );
83
+ LLVMValueRef Int = LLVMConstInt (LLVMInt32TypeInContext ( Context ), 0 , 0 );
84
84
LLVMValueRef NodeMD = LLVMMDNode (& Int , 1 );
85
85
assert (LLVMIsAValueAsMetadata (NodeMD ) == NodeMD );
86
86
(void )NodeMD ;
@@ -98,3 +98,21 @@ int llvm_is_a_value_as_metadata(void) {
98
98
99
99
return 0 ;
100
100
}
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
+ }
You can’t perform that action at this time.
0 commit comments