1 /*===-- module.c - tool for testing libLLVM and llvm-c API ----------------===*\
3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
5 |* See https://llvm.org/LICENSE.txt for license information. *|
6 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
8 |*===----------------------------------------------------------------------===*|
10 |* This file implements the --module-dump, --module-list-functions and *|
11 |* --module-list-globals commands in llvm-c-test. *|
13 \*===----------------------------------------------------------------------===*/
15 #include "llvm-c-test.h"
16 #include "llvm-c/BitReader.h"
20 static 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
);
27 LLVMModuleRef
llvm_load_module(bool Lazy
, bool New
) {
28 LLVMMemoryBufferRef MB
;
32 if (LLVMCreateMemoryBufferWithSTDIN(&MB
, &msg
)) {
33 fprintf(stderr
, "Error reading file: %s\n", msg
);
39 LLVMContextRef C
= LLVMGetGlobalContext();
40 LLVMContextSetDiagnosticHandler(C
, diagnosticHandler
, NULL
);
42 Ret
= LLVMGetBitcodeModule2(MB
, &M
);
44 Ret
= LLVMParseBitcode2(MB
, &M
);
47 Ret
= LLVMGetBitcodeModule(MB
, &M
, &msg
);
49 Ret
= LLVMParseBitcode(MB
, &M
, &msg
);
53 fprintf(stderr
, "Error parsing bitcode: %s\n", msg
);
54 LLVMDisposeMemoryBuffer(MB
);
59 LLVMDisposeMemoryBuffer(MB
);
64 int llvm_module_dump(bool Lazy
, bool New
) {
65 LLVMModuleRef M
= llvm_load_module(Lazy
, New
);
67 char *irstr
= LLVMPrintModuleToString(M
);
69 LLVMDisposeMessage(irstr
);
76 int llvm_module_list_functions(void) {
77 LLVMModuleRef M
= llvm_load_module(false, false);
80 f
= LLVMGetFirstFunction(M
);
82 if (LLVMIsDeclaration(f
)) {
83 printf("FunctionDeclaration: %s\n", LLVMGetValueName(f
));
90 printf("FunctionDefinition: %s [#bb=%u]\n", LLVMGetValueName(f
),
91 LLVMCountBasicBlocks(f
));
93 for (bb
= LLVMGetFirstBasicBlock(f
); bb
;
94 bb
= LLVMGetNextBasicBlock(bb
)) {
96 for (isn
= LLVMGetFirstInstruction(bb
); isn
;
97 isn
= LLVMGetNextInstruction(isn
)) {
99 if (LLVMIsACallInst(isn
)) {
100 LLVMValueRef callee
=
101 LLVMGetOperand(isn
, LLVMGetNumOperands(isn
) - 1);
102 printf(" calls: %s\n", LLVMGetValueName(callee
));
106 printf(" #isn: %u\n", nisn
);
107 printf(" #bb: %u\n\n", nbb
);
109 f
= LLVMGetNextFunction(f
);
112 LLVMDisposeModule(M
);
117 int llvm_module_list_globals(void) {
118 LLVMModuleRef M
= llvm_load_module(false, false);
121 g
= LLVMGetFirstGlobal(M
);
123 LLVMTypeRef T
= LLVMTypeOf(g
);
124 char *s
= LLVMPrintTypeToString(T
);
126 printf("Global%s: %s %s\n",
127 LLVMIsDeclaration(g
) ? "Declaration" : "Definition",
128 LLVMGetValueName(g
), s
);
130 LLVMDisposeMessage(s
);
132 g
= LLVMGetNextGlobal(g
);
135 LLVMDisposeModule(M
);