summaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-c-test/metadata.c
blob: 9c19275642b7e81a918f82346dc6f2ba9a2f368d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\
|*                                                                            *|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
|* Exceptions.                                                                *|
|* See https://llvm.org/LICENSE.txt for license information.                  *|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
|*                                                                            *|
|*===----------------------------------------------------------------------===*|
|*                                                                            *|
|* This file implements the --add-named-metadata-operand and --set-metadata   *|
|* commands in llvm-c-test.                                                   *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/

#include "llvm-c-test.h"

#include <assert.h>
#include <string.h>

int llvm_add_named_metadata_operand(void) {
  LLVMModuleRef m = LLVMModuleCreateWithName("Mod");
  LLVMValueRef values[] = { LLVMConstInt(LLVMInt32Type(), 0, 0) };

  // This used to trigger an assertion
  LLVMAddNamedMetadataOperand(m, "name", LLVMMDNode(values, 1));

  LLVMDisposeModule(m);

  return 0;
}

int llvm_set_metadata(void) {
  LLVMBuilderRef b = LLVMCreateBuilder();
  LLVMValueRef values[] = { LLVMConstInt(LLVMInt32Type(), 0, 0) };

  // This used to trigger an assertion
  LLVMValueRef ret = LLVMBuildRetVoid(b);
  LLVMSetMetadata(ret, LLVMGetMDKindID("kind", 4), LLVMMDNode(values, 1));

  LLVMDisposeBuilder(b);
  LLVMDeleteInstruction(ret);

  return 0;
}

int llvm_replace_md_operand(void) {
  LLVMModuleRef m = LLVMModuleCreateWithName("Mod");
  LLVMContextRef context = LLVMGetModuleContext(m);
  unsigned int tmp = 0;

  LLVMMetadataRef metas[] = {LLVMMDStringInContext2(context, "foo", 3)};
  LLVMValueRef md =
      LLVMMetadataAsValue(context, LLVMMDNodeInContext2(context, metas, 1));

  LLVMReplaceMDNodeOperandWith(md, 0,
                               LLVMMDStringInContext2(context, "bar", 3));

  assert(!strncmp(LLVMGetMDString(LLVMGetOperand(md, 0), &tmp), "bar", 0));
  (void)tmp;

  LLVMDisposeModule(m);

  return 0;
}

int llvm_is_a_value_as_metadata(void) {
  LLVMModuleRef m = LLVMModuleCreateWithName("Mod");
  LLVMContextRef context = LLVMGetModuleContext(m);

  LLVMValueRef values[] = {LLVMConstInt(LLVMInt32Type(), 0, 0)};
  LLVMValueRef md = LLVMMDNode(values, 1);
  assert(LLVMIsAValueAsMetadata(md) == md);
  (void)md;

  LLVMMetadataRef metas[] = {LLVMMDStringInContext2(context, "foo", 3)};
  LLVMValueRef md2 =
      LLVMMetadataAsValue(context, LLVMMDNodeInContext2(context, metas, 1));
  assert(LLVMIsAValueAsMetadata(md2) == NULL);
  (void)md2;

  return 0;
}