1/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\
2|* *|
3|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
4|* Exceptions. *|
5|* See https://llvm.org/LICENSE.txt for license information. *|
6|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
7|* *|
8|*===----------------------------------------------------------------------===*|
9|* *|
10|* This file implements the --add-named-metadata-operand and --set-metadata *|
11|* commands in llvm-c-test. *|
12|* *|
13\*===----------------------------------------------------------------------===*/
14
15#include "llvm-c-test.h"
16#include "llvm-c/Types.h"
17
18#include <assert.h>
19#include <string.h>
20
21int llvm_add_named_metadata_operand(void) {
22 LLVMContextRef C = LLVMContextCreate();
23 LLVMModuleRef M = LLVMModuleCreateWithNameInContext(ModuleID: "Mod", C);
24 LLVMValueRef Int = LLVMConstInt(IntTy: LLVMInt32TypeInContext(C), N: 0, SignExtend: 0);
25
26 // This used to trigger an assertion
27 LLVMAddNamedMetadataOperand(M, Name: "name", Val: LLVMMDNodeInContext(C, Vals: &Int, Count: 1));
28
29 LLVMDisposeModule(M);
30 LLVMContextDispose(C);
31
32 return 0;
33}
34
35int llvm_set_metadata(void) {
36 LLVMContextRef C = LLVMContextCreate();
37 LLVMBuilderRef Builder = LLVMCreateBuilderInContext(C);
38
39 // This used to trigger an assertion
40 LLVMValueRef Return = LLVMBuildRetVoid(Builder);
41
42 const char Name[] = "kind";
43 LLVMValueRef Int = LLVMConstInt(IntTy: LLVMInt32TypeInContext(C), N: 0, SignExtend: 0);
44 LLVMSetMetadata(Val: Return, KindID: LLVMGetMDKindIDInContext(C, Name, SLen: strlen(s: Name)),
45 Node: LLVMMDNodeInContext(C, Vals: &Int, Count: 1));
46
47 LLVMDisposeBuilder(Builder);
48 LLVMDeleteInstruction(Inst: Return);
49 LLVMContextDispose(C);
50
51 return 0;
52}
53
54int llvm_replace_md_operand(void) {
55 LLVMContextRef Context = LLVMContextCreate();
56 LLVMModuleRef M = LLVMModuleCreateWithNameInContext(ModuleID: "Mod", C: Context);
57
58 const char String1[] = "foo";
59 LLVMMetadataRef String1MD =
60 LLVMMDStringInContext2(C: Context, Str: String1, SLen: strlen(s: String1));
61 LLVMMetadataRef NodeMD = LLVMMDNodeInContext2(C: Context, MDs: &String1MD, Count: 1);
62 LLVMValueRef Value = LLVMMetadataAsValue(C: Context, MD: NodeMD);
63
64 const char String2[] = "bar";
65 LLVMMetadataRef String2MD =
66 LLVMMDStringInContext2(C: Context, Str: String2, SLen: strlen(s: String2));
67 LLVMReplaceMDNodeOperandWith(V: Value, Index: 0, Replacement: String2MD);
68
69 LLVMValueRef Operand = LLVMGetOperand(Val: Value, Index: 0);
70
71 unsigned int Len;
72 const char *String = LLVMGetMDString(V: Operand, Length: &Len);
73 assert(Len == strlen(String2));
74 assert(strncmp(String, String2, Len) == 0);
75 (void)String;
76
77 LLVMDisposeModule(M);
78 LLVMContextDispose(C: Context);
79
80 return 0;
81}
82
83int llvm_is_a_value_as_metadata(void) {
84 LLVMContextRef Context = LLVMContextCreate();
85 LLVMModuleRef M = LLVMModuleCreateWithNameInContext(ModuleID: "Mod", C: Context);
86
87 {
88 LLVMValueRef Int = LLVMConstInt(IntTy: LLVMInt32TypeInContext(C: Context), N: 0, SignExtend: 0);
89 LLVMValueRef NodeMD = LLVMMDNodeInContext(C: Context, Vals: &Int, Count: 1);
90 assert(LLVMIsAValueAsMetadata(NodeMD) == NodeMD);
91 (void)NodeMD;
92 }
93
94 {
95 const char String[] = "foo";
96 LLVMMetadataRef StringMD =
97 LLVMMDStringInContext2(C: Context, Str: String, SLen: strlen(s: String));
98 LLVMMetadataRef NodeMD = LLVMMDNodeInContext2(C: Context, MDs: &StringMD, Count: 1);
99 LLVMValueRef Value = LLVMMetadataAsValue(C: Context, MD: NodeMD);
100 assert(LLVMIsAValueAsMetadata(Value) == NULL);
101 (void)Value;
102 }
103
104 LLVMDisposeModule(M);
105 LLVMContextDispose(C: Context);
106
107 return 0;
108}
109