1 /*===-- object.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 --object-list-sections and --object-list-symbols  *|
11 |* commands in llvm-c-test.                                                   *|
12 |*                                                                            *|
13 \*===----------------------------------------------------------------------===*/
14 
15 #include "llvm-c-test.h"
16 #include "llvm-c/Core.h"
17 #include "llvm-c/Object.h"
18 #include <stdio.h>
19 #include <stdlib.h>
20 
object_list_sections(void)21 int object_list_sections(void) {
22   LLVMMemoryBufferRef MB;
23   LLVMObjectFileRef O;
24   LLVMSectionIteratorRef sect;
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   O = LLVMCreateObjectFile(MB);
33   if (!O) {
34     fprintf(stderr, "Error reading object\n");
35     exit(1);
36   }
37 
38   sect = LLVMGetSections(O);
39   while (!LLVMIsSectionIteratorAtEnd(O, sect)) {
40     printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect),
41            LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect));
42 
43     LLVMMoveToNextSection(sect);
44   }
45 
46   LLVMDisposeSectionIterator(sect);
47 
48   LLVMDisposeObjectFile(O);
49 
50   return 0;
51 }
52 
object_list_symbols(void)53 int object_list_symbols(void) {
54   LLVMMemoryBufferRef MB;
55   LLVMObjectFileRef O;
56   LLVMSectionIteratorRef sect;
57   LLVMSymbolIteratorRef sym;
58   char *msg = NULL;
59 
60   if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) {
61     fprintf(stderr, "Error reading file: %s\n", msg);
62     exit(1);
63   }
64 
65   O = LLVMCreateObjectFile(MB);
66   if (!O) {
67     fprintf(stderr, "Error reading object\n");
68     exit(1);
69   }
70 
71   sect = LLVMGetSections(O);
72   sym = LLVMGetSymbols(O);
73   while (!LLVMIsSymbolIteratorAtEnd(O, sym)) {
74 
75     LLVMMoveToContainingSection(sect, sym);
76     printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),
77            LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),
78            LLVMGetSectionName(sect));
79 
80     LLVMMoveToNextSymbol(sym);
81   }
82 
83   LLVMDisposeSymbolIterator(sym);
84 
85   LLVMDisposeObjectFile(O);
86 
87   return 0;
88 }
89