/*===-- 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 <assert.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 int Idx, ParamCount; for (Idx = LLVMAttributeFunctionIndex, ParamCount = LLVMCountParams(F); Idx <= ParamCount; ++Idx) { int AttrCount = LLVMGetAttributeCountAtIndex(F, Idx); LLVMAttributeRef *Attrs = (LLVMAttributeRef *)malloc(AttrCount * sizeof(LLVMAttributeRef)); assert(Attrs); 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 int Idx, ParamCount; for (Idx = LLVMAttributeFunctionIndex, ParamCount = LLVMCountParams(F); Idx <= ParamCount; ++Idx) { int AttrCount = LLVMGetCallSiteAttributeCount(I, Idx); LLVMAttributeRef *Attrs = (LLVMAttributeRef *)malloc( AttrCount * sizeof(LLVMAttributeRef)); assert(Attrs); LLVMGetCallSiteAttributes(I, Idx, Attrs); free(Attrs); } } } } F = LLVMGetNextFunction(F); } LLVMDisposeModule(M); return 0; }