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