/*===-- 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 #include 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; }