llvm-c-test: Don't leak memory buffers.
[oota-llvm.git] / tools / llvm-c-test / module.c
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
22 static 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     LLVMDisposeMemoryBuffer(MB);
35     exit(1);
36   }
37
38   LLVMDisposeMemoryBuffer(MB);
39   return M;
40 }
41
42 int module_dump(void) {
43   LLVMModuleRef M = load_module();
44
45   char *irstr = LLVMPrintModuleToString(M);
46   puts(irstr);
47   LLVMDisposeMessage(irstr);
48
49   LLVMDisposeModule(M);
50
51   return 0;
52 }
53
54 int module_list_functions(void) {
55   LLVMModuleRef M = load_module();
56   LLVMValueRef f;
57
58   f = LLVMGetFirstFunction(M);
59   while (f) {
60     if (LLVMIsDeclaration(f)) {
61       printf("FunctionDeclaration: %s\n", LLVMGetValueName(f));
62     } else {
63       LLVMBasicBlockRef bb;
64       LLVMValueRef isn;
65       unsigned nisn = 0;
66       unsigned nbb = 0;
67
68       printf("FunctionDefinition: %s [#bb=%u]\n", LLVMGetValueName(f),
69              LLVMCountBasicBlocks(f));
70
71       for (bb = LLVMGetFirstBasicBlock(f); bb;
72            bb = LLVMGetNextBasicBlock(bb)) {
73         nbb++;
74         for (isn = LLVMGetFirstInstruction(bb); isn;
75              isn = LLVMGetNextInstruction(isn)) {
76           nisn++;
77           if (LLVMIsACallInst(isn)) {
78             LLVMValueRef callee =
79                 LLVMGetOperand(isn, LLVMGetNumOperands(isn) - 1);
80             printf(" calls: %s\n", LLVMGetValueName(callee));
81           }
82         }
83       }
84       printf(" #isn: %u\n", nisn);
85       printf(" #bb: %u\n\n", nbb);
86     }
87     f = LLVMGetNextFunction(f);
88   }
89
90   LLVMDisposeModule(M);
91
92   return 0;
93 }
94
95 int module_list_globals(void) {
96   LLVMModuleRef M = load_module();
97   LLVMValueRef g;
98
99   g = LLVMGetFirstGlobal(M);
100   while (g) {
101     LLVMTypeRef T = LLVMTypeOf(g);
102     char *s = LLVMPrintTypeToString(T);
103
104     printf("Global%s: %s %s\n",
105            LLVMIsDeclaration(g) ? "Declaration" : "Definition",
106            LLVMGetValueName(g), s);
107
108     LLVMDisposeMessage(s);
109
110     g = LLVMGetNextGlobal(g);
111   }
112
113   LLVMDisposeModule(M);
114
115   return 0;
116 }