--- /dev/null
+/*===-- attributes.c - tool for testing libLLVM and llvm-c API ------------===*\
+|* *|
+|* The LLVM Compiler Infrastructure *|
+|* *|
+|* This file is distributed under the University of Illinois Open Source *|
+|* License. See LICENSE.TXT for details. *|
+|* *|
+|*===----------------------------------------------------------------------===*|
+|* *|
+|* This file implements the --test-attributes and --test-callsite-attributes *|
+|* commands in llvm-c-test. *|
+|* *|
+\*===----------------------------------------------------------------------===*/
+
+#include "llvm-c-test.h"
+
+#include <stdlib.h>
+
+int llvm_test_function_attributes(void) {
+ LLVMEnablePrettyStackTrace();
+
+ LLVMModuleRef M = llvm_load_module(false, true);
+
+ LLVMValueRef F = LLVMGetFirstFunction(M);
+ while (F) {
+ // Read attributes
+ for (int Idx = LLVMAttributeFunctionIndex, ParamCount = LLVMCountParams(F);
+ Idx <= ParamCount; ++Idx) {
+ int AttrCount = LLVMGetAttributeCountAtIndex(F, Idx);
+ LLVMAttributeRef *Attrs =
+ (LLVMAttributeRef *)malloc(AttrCount * sizeof(LLVMAttributeRef));
+ LLVMGetAttributesAtIndex(F, Idx, Attrs);
+ free(Attrs);
+ }
+ F = LLVMGetNextFunction(F);
+ }
+
+ LLVMDisposeModule(M);
+
+ return 0;
+}
+
+int llvm_test_callsite_attributes(void) {
+ LLVMEnablePrettyStackTrace();
+
+ LLVMModuleRef M = llvm_load_module(false, true);
+
+ LLVMValueRef F = LLVMGetFirstFunction(M);
+ while (F) {
+ LLVMBasicBlockRef BB;
+ for (BB = LLVMGetFirstBasicBlock(F); BB; BB = LLVMGetNextBasicBlock(BB)) {
+ LLVMValueRef I;
+ for (I = LLVMGetFirstInstruction(BB); I; I = LLVMGetNextInstruction(I)) {
+ if (LLVMIsACallInst(I)) {
+ // Read attributes
+ for (int Idx = LLVMAttributeFunctionIndex,
+ ParamCount = LLVMCountParams(F);
+ Idx <= ParamCount; ++Idx) {
+ int AttrCount = LLVMGetCallSiteAttributeCount(I, Idx);
+ LLVMAttributeRef *Attrs = (LLVMAttributeRef *)malloc(
+ AttrCount * sizeof(LLVMAttributeRef));
+ LLVMGetCallSiteAttributes(I, Idx, Attrs);
+ free(Attrs);
+ }
+ }
+ }
+ }
+
+ F = LLVMGetNextFunction(F);
+ }
+
+ LLVMDisposeModule(M);
+
+ return 0;
+}
return llvm_add_named_metadata_operand();
} else if (argc == 2 && !strcmp(argv[1], "--set-metadata")) {
return llvm_set_metadata();
+ } else if (argc == 2 && !strcmp(argv[1], "--test-function-attributes")) {
+ return llvm_test_function_attributes();
+ } else if (argc == 2 && !strcmp(argv[1], "--test-callsite-attributes")) {
+ return llvm_test_callsite_attributes();
} else if (argc == 2 && !strcmp(argv[1], "--echo")) {
return llvm_echo();
} else if (argc == 2 && !strcmp(argv[1], "--test-diagnostic-handler")) {