xref: /llvm-project/llvm/tools/llvm-c-test/object.c (revision d1ba3b13f83ebb7a76b62cacb1a97006c8d9f4b3)
1b932c669SAnders Waldenborg /*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\
2b932c669SAnders Waldenborg |*                                                                            *|
32946cd70SChandler Carruth |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
42946cd70SChandler Carruth |* Exceptions.                                                                *|
52946cd70SChandler Carruth |* See https://llvm.org/LICENSE.txt for license information.                  *|
62946cd70SChandler Carruth |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
7b932c669SAnders Waldenborg |*                                                                            *|
8b932c669SAnders Waldenborg |*===----------------------------------------------------------------------===*|
9b932c669SAnders Waldenborg |*                                                                            *|
10b932c669SAnders Waldenborg |* This file implements the --object-list-sections and --object-list-symbols  *|
11b932c669SAnders Waldenborg |* commands in llvm-c-test.                                                   *|
12b932c669SAnders Waldenborg |*                                                                            *|
13b932c669SAnders Waldenborg \*===----------------------------------------------------------------------===*/
14b932c669SAnders Waldenborg 
15b932c669SAnders Waldenborg #include "llvm-c-test.h"
16b932c669SAnders Waldenborg #include "llvm-c/Object.h"
17b932c669SAnders Waldenborg #include <stdio.h>
18b932c669SAnders Waldenborg #include <stdlib.h>
19b932c669SAnders Waldenborg 
llvm_object_list_sections(void)209a3bd236SBenjamin Kramer int llvm_object_list_sections(void) {
21b932c669SAnders Waldenborg   LLVMMemoryBufferRef MB;
22*d1ba3b13SRobert Widmann   LLVMBinaryRef O;
23c4914695SNAKAMURA Takumi   LLVMSectionIteratorRef sect;
24b932c669SAnders Waldenborg 
25*d1ba3b13SRobert Widmann   char *outBufferErr = NULL;
26*d1ba3b13SRobert Widmann   if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
27*d1ba3b13SRobert Widmann     fprintf(stderr, "Error reading file: %s\n", outBufferErr);
28*d1ba3b13SRobert Widmann     free(outBufferErr);
29b932c669SAnders Waldenborg     exit(1);
30b932c669SAnders Waldenborg   }
31b932c669SAnders Waldenborg 
32*d1ba3b13SRobert Widmann   char *outBinaryErr = NULL;
33*d1ba3b13SRobert Widmann   O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr);
34*d1ba3b13SRobert Widmann   if (!O || outBinaryErr) {
35*d1ba3b13SRobert Widmann     fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
36*d1ba3b13SRobert Widmann     free(outBinaryErr);
37b932c669SAnders Waldenborg     exit(1);
38b932c669SAnders Waldenborg   }
39b932c669SAnders Waldenborg 
40*d1ba3b13SRobert Widmann   sect = LLVMObjectFileCopySectionIterator(O);
41*d1ba3b13SRobert Widmann   while (sect && !LLVMObjectFileIsSectionIteratorAtEnd(O, sect)) {
42b932c669SAnders Waldenborg     printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect),
43b932c669SAnders Waldenborg            LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect));
44b932c669SAnders Waldenborg 
45b932c669SAnders Waldenborg     LLVMMoveToNextSection(sect);
46b932c669SAnders Waldenborg   }
47b932c669SAnders Waldenborg 
48b932c669SAnders Waldenborg   LLVMDisposeSectionIterator(sect);
49b932c669SAnders Waldenborg 
50*d1ba3b13SRobert Widmann   LLVMDisposeBinary(O);
51*d1ba3b13SRobert Widmann 
52*d1ba3b13SRobert Widmann   LLVMDisposeMemoryBuffer(MB);
53b932c669SAnders Waldenborg 
54b932c669SAnders Waldenborg   return 0;
55b932c669SAnders Waldenborg }
56b932c669SAnders Waldenborg 
llvm_object_list_symbols(void)579a3bd236SBenjamin Kramer int llvm_object_list_symbols(void) {
58b932c669SAnders Waldenborg   LLVMMemoryBufferRef MB;
59*d1ba3b13SRobert Widmann   LLVMBinaryRef O;
60c4914695SNAKAMURA Takumi   LLVMSectionIteratorRef sect;
61c4914695SNAKAMURA Takumi   LLVMSymbolIteratorRef sym;
62b932c669SAnders Waldenborg 
63*d1ba3b13SRobert Widmann   char *outBufferErr = NULL;
64*d1ba3b13SRobert Widmann   if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
65*d1ba3b13SRobert Widmann     fprintf(stderr, "Error reading file: %s\n", outBufferErr);
66*d1ba3b13SRobert Widmann     free(outBufferErr);
67b932c669SAnders Waldenborg     exit(1);
68b932c669SAnders Waldenborg   }
69b932c669SAnders Waldenborg 
70*d1ba3b13SRobert Widmann   char *outBinaryErr = NULL;
71*d1ba3b13SRobert Widmann   O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr);
72*d1ba3b13SRobert Widmann   if (!O || outBinaryErr) {
73*d1ba3b13SRobert Widmann     fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
74*d1ba3b13SRobert Widmann     free(outBinaryErr);
75b932c669SAnders Waldenborg     exit(1);
76b932c669SAnders Waldenborg   }
77b932c669SAnders Waldenborg 
78*d1ba3b13SRobert Widmann   sect = LLVMObjectFileCopySectionIterator(O);
79*d1ba3b13SRobert Widmann   sym = LLVMObjectFileCopySymbolIterator(O);
80*d1ba3b13SRobert Widmann   while (sect && sym && !LLVMObjectFileIsSymbolIteratorAtEnd(O, sym)) {
81b932c669SAnders Waldenborg 
82b932c669SAnders Waldenborg     LLVMMoveToContainingSection(sect, sym);
836956b1a5SRafael Espindola     printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),
846956b1a5SRafael Espindola            LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),
85b932c669SAnders Waldenborg            LLVMGetSectionName(sect));
86b932c669SAnders Waldenborg 
87b932c669SAnders Waldenborg     LLVMMoveToNextSymbol(sym);
88b932c669SAnders Waldenborg   }
89b932c669SAnders Waldenborg 
90b932c669SAnders Waldenborg   LLVMDisposeSymbolIterator(sym);
91b932c669SAnders Waldenborg 
92*d1ba3b13SRobert Widmann   LLVMDisposeBinary(O);
93*d1ba3b13SRobert Widmann 
94*d1ba3b13SRobert Widmann   LLVMDisposeMemoryBuffer(MB);
95b932c669SAnders Waldenborg 
96b932c669SAnders Waldenborg   return 0;
97b932c669SAnders Waldenborg }
98