module.c revision 90fd79a222652126ee7d85f3afb2cd85aa51b2f9
1/*===-- module.c - tool for testing libLLVM and llvm-c API ----------------===*\ 2|* *| 3|* The LLVM Compiler Infrastructure *| 4|* *| 5|* This file is distributed under the University of Illinois Open Source *| 6|* License. See LICENSE.TXT for details. *| 7|* *| 8|*===----------------------------------------------------------------------===*| 9|* *| 10|* This file implements the --module-dump, --module-list-functions and *| 11|* --module-list-globals commands in llvm-c-test. *| 12|* *| 13\*===----------------------------------------------------------------------===*/ 14 15#include "llvm-c-test.h" 16#include "llvm-c/BitReader.h" 17#include "llvm-c/Core.h" 18#include <stdio.h> 19#include <stdlib.h> 20#include <string.h> 21 22static LLVMModuleRef load_module(void) { 23 LLVMMemoryBufferRef MB; 24 LLVMModuleRef M; 25 char *msg = NULL; 26 27 if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { 28 fprintf(stderr, "Error reading file: %s\n", msg); 29 exit(1); 30 } 31 32 if (LLVMParseBitcode(MB, &M, &msg)) { 33 fprintf(stderr, "Error parsing bitcode: %s\n", msg); 34 exit(1); 35 } 36 37 return M; 38} 39 40int module_dump(void) { 41 LLVMModuleRef M = load_module(); 42 43 char *irstr = LLVMPrintModuleToString(M); 44 puts(irstr); 45 LLVMDisposeMessage(irstr); 46 47 LLVMDisposeModule(M); 48 49 return 0; 50} 51 52int module_list_functions(void) { 53 LLVMModuleRef M = load_module(); 54 LLVMValueRef f; 55 56 f = LLVMGetFirstFunction(M); 57 while (f) { 58 if (LLVMIsDeclaration(f)) { 59 printf("FunctionDeclaration: %s\n", LLVMGetValueName(f)); 60 } else { 61 LLVMBasicBlockRef bb; 62 LLVMValueRef isn; 63 unsigned nisn = 0; 64 unsigned nbb = 0; 65 66 printf("FunctionDefinition: %s [#bb=%u]\n", LLVMGetValueName(f), 67 LLVMCountBasicBlocks(f)); 68 69 for (bb = LLVMGetFirstBasicBlock(f); bb; 70 bb = LLVMGetNextBasicBlock(bb)) { 71 nbb++; 72 for (isn = LLVMGetFirstInstruction(bb); isn; 73 isn = LLVMGetNextInstruction(isn)) { 74 nisn++; 75 if (LLVMIsACallInst(isn)) { 76 LLVMValueRef callee = 77 LLVMGetOperand(isn, LLVMGetNumOperands(isn) - 1); 78 printf(" calls: %s\n", LLVMGetValueName(callee)); 79 } 80 } 81 } 82 printf(" #isn: %u\n", nisn); 83 printf(" #bb: %u\n\n", nbb); 84 } 85 f = LLVMGetNextFunction(f); 86 } 87 88 LLVMDisposeModule(M); 89 90 return 0; 91} 92 93int module_list_globals(void) { 94 LLVMModuleRef M = load_module(); 95 LLVMValueRef g; 96 97 g = LLVMGetFirstGlobal(M); 98 while (g) { 99 LLVMTypeRef T = LLVMTypeOf(g); 100 char *s = LLVMPrintTypeToString(T); 101 102 printf("Global%s: %s %s\n", 103 LLVMIsDeclaration(g) ? "Declaration" : "Definition", 104 LLVMGetValueName(g), s); 105 106 LLVMDisposeMessage(s); 107 108 g = LLVMGetNextGlobal(g); 109 } 110 111 LLVMDisposeModule(M); 112 113 return 0; 114} 115