/*===-- 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 "llvm-c/Types.h" #include #include int llvm_add_named_metadata_operand(void) { LLVMModuleRef M = LLVMModuleCreateWithName("Mod"); LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0); // This used to trigger an assertion LLVMAddNamedMetadataOperand(M, "name", LLVMMDNode(&Int, 1)); LLVMDisposeModule(M); return 0; } int llvm_set_metadata(void) { LLVMBuilderRef Builder = LLVMCreateBuilder(); // This used to trigger an assertion LLVMValueRef Return = LLVMBuildRetVoid(Builder); const char Name[] = "kind"; LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0); LLVMSetMetadata(Return, LLVMGetMDKindID(Name, strlen(Name)), LLVMMDNode(&Int, 1)); LLVMDisposeBuilder(Builder); LLVMDeleteInstruction(Return); return 0; } int llvm_replace_md_operand(void) { LLVMModuleRef M = LLVMModuleCreateWithName("Mod"); LLVMContextRef Context = LLVMGetModuleContext(M); const char String1[] = "foo"; LLVMMetadataRef String1MD = LLVMMDStringInContext2(Context, String1, strlen(String1)); LLVMMetadataRef NodeMD = LLVMMDNodeInContext2(Context, &String1MD, 1); LLVMValueRef Value = LLVMMetadataAsValue(Context, NodeMD); const char String2[] = "bar"; LLVMMetadataRef String2MD = LLVMMDStringInContext2(Context, String2, strlen(String2)); LLVMReplaceMDNodeOperandWith(Value, 0, String2MD); LLVMValueRef Operand = LLVMGetOperand(Value, 0); unsigned int Len; const char *String = LLVMGetMDString(Operand, &Len); assert(Len == strlen(String2)); assert(strncmp(String, String2, Len) == 0); (void)String; LLVMDisposeModule(M); return 0; } int llvm_is_a_value_as_metadata(void) { LLVMModuleRef M = LLVMModuleCreateWithName("Mod"); LLVMContextRef Context = LLVMGetModuleContext(M); { LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0); LLVMValueRef NodeMD = LLVMMDNode(&Int, 1); assert(LLVMIsAValueAsMetadata(NodeMD) == NodeMD); (void)NodeMD; } { const char String[] = "foo"; LLVMMetadataRef StringMD = LLVMMDStringInContext2(Context, String, strlen(String)); LLVMMetadataRef NodeMD = LLVMMDNodeInContext2(Context, &StringMD, 1); LLVMValueRef Value = LLVMMetadataAsValue(Context, NodeMD); assert(LLVMIsAValueAsMetadata(Value) == NULL); (void)Value; } return 0; }