blob: cbb44d0bd15e4dad8469ab2b06824b5c01f33cb7 [file] [log] [blame]
Anders Waldenborg2bef1a62013-10-23 08:10:20 +00001/*===-- 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"
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000017#include <stdio.h>
18#include <stdlib.h>
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000019
Rafael Espindola8d184ad2015-12-18 23:46:42 +000020static void diagnosticHandler(LLVMDiagnosticInfoRef DI, void *C) {
21 char *CErr = LLVMGetDiagInfoDescription(DI);
22 fprintf(stderr, "Error with new bitcode parser: %s\n", CErr);
23 LLVMDisposeMessage(CErr);
24 exit(1);
25}
26
Benjamin Kramer2e130532016-02-05 13:31:14 +000027LLVMModuleRef llvm_load_module(bool Lazy, bool New) {
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000028 LLVMMemoryBufferRef MB;
29 LLVMModuleRef M;
30 char *msg = NULL;
31
32 if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) {
33 fprintf(stderr, "Error reading file: %s\n", msg);
34 exit(1);
35 }
36
Rafael Espindola0b270d12015-12-18 03:57:26 +000037 LLVMBool Ret;
Rafael Espindola8d184ad2015-12-18 23:46:42 +000038 if (New) {
39 LLVMContextRef C = LLVMGetGlobalContext();
40 LLVMContextSetDiagnosticHandler(C, diagnosticHandler, NULL);
41 if (Lazy)
42 Ret = LLVMGetBitcodeModule2(MB, &M);
43 else
44 Ret = LLVMParseBitcode2(MB, &M);
45 } else {
46 if (Lazy)
47 Ret = LLVMGetBitcodeModule(MB, &M, &msg);
48 else
49 Ret = LLVMParseBitcode(MB, &M, &msg);
50 }
Rafael Espindola0b270d12015-12-18 03:57:26 +000051
52 if (Ret) {
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000053 fprintf(stderr, "Error parsing bitcode: %s\n", msg);
Benjamin Kramer50c5b462013-10-25 15:58:58 +000054 LLVMDisposeMemoryBuffer(MB);
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000055 exit(1);
56 }
57
Rafael Espindola0b270d12015-12-18 03:57:26 +000058 if (!Lazy)
59 LLVMDisposeMemoryBuffer(MB);
60
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000061 return M;
62}
63
Benjamin Kramer2e130532016-02-05 13:31:14 +000064int llvm_module_dump(bool Lazy, bool New) {
65 LLVMModuleRef M = llvm_load_module(Lazy, New);
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000066
67 char *irstr = LLVMPrintModuleToString(M);
68 puts(irstr);
69 LLVMDisposeMessage(irstr);
70
71 LLVMDisposeModule(M);
72
73 return 0;
74}
75
Benjamin Kramer2e130532016-02-05 13:31:14 +000076int llvm_module_list_functions(void) {
77 LLVMModuleRef M = llvm_load_module(false, false);
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000078 LLVMValueRef f;
79
80 f = LLVMGetFirstFunction(M);
81 while (f) {
82 if (LLVMIsDeclaration(f)) {
83 printf("FunctionDeclaration: %s\n", LLVMGetValueName(f));
84 } else {
NAKAMURA Takumi90fd79a2013-10-23 17:56:37 +000085 LLVMBasicBlockRef bb;
86 LLVMValueRef isn;
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000087 unsigned nisn = 0;
88 unsigned nbb = 0;
89
90 printf("FunctionDefinition: %s [#bb=%u]\n", LLVMGetValueName(f),
91 LLVMCountBasicBlocks(f));
92
NAKAMURA Takumi90fd79a2013-10-23 17:56:37 +000093 for (bb = LLVMGetFirstBasicBlock(f); bb;
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000094 bb = LLVMGetNextBasicBlock(bb)) {
95 nbb++;
NAKAMURA Takumi90fd79a2013-10-23 17:56:37 +000096 for (isn = LLVMGetFirstInstruction(bb); isn;
Anders Waldenborg2bef1a62013-10-23 08:10:20 +000097 isn = LLVMGetNextInstruction(isn)) {
98 nisn++;
99 if (LLVMIsACallInst(isn)) {
100 LLVMValueRef callee =
101 LLVMGetOperand(isn, LLVMGetNumOperands(isn) - 1);
102 printf(" calls: %s\n", LLVMGetValueName(callee));
103 }
104 }
105 }
106 printf(" #isn: %u\n", nisn);
107 printf(" #bb: %u\n\n", nbb);
108 }
109 f = LLVMGetNextFunction(f);
110 }
111
112 LLVMDisposeModule(M);
113
114 return 0;
115}
116
Benjamin Kramer2e130532016-02-05 13:31:14 +0000117int llvm_module_list_globals(void) {
118 LLVMModuleRef M = llvm_load_module(false, false);
Anders Waldenborg2bef1a62013-10-23 08:10:20 +0000119 LLVMValueRef g;
120
121 g = LLVMGetFirstGlobal(M);
122 while (g) {
123 LLVMTypeRef T = LLVMTypeOf(g);
124 char *s = LLVMPrintTypeToString(T);
125
126 printf("Global%s: %s %s\n",
127 LLVMIsDeclaration(g) ? "Declaration" : "Definition",
128 LLVMGetValueName(g), s);
129
130 LLVMDisposeMessage(s);
131
132 g = LLVMGetNextGlobal(g);
133 }
134
135 LLVMDisposeModule(M);
136
137 return 0;
138}