diff options
Diffstat (limited to 'llvm/tools/llvm-c-test/attributes.c')
-rw-r--r-- | llvm/tools/llvm-c-test/attributes.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/llvm/tools/llvm-c-test/attributes.c b/llvm/tools/llvm-c-test/attributes.c new file mode 100644 index 00000000000..7f07a220ad3 --- /dev/null +++ b/llvm/tools/llvm-c-test/attributes.c @@ -0,0 +1,75 @@ +/*===-- 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; +} |