98 lines · c
1/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\2|* *|3|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|4|* Exceptions. *|5|* See https://llvm.org/LICENSE.txt for license information. *|6|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|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/Object.h"17#include <stdio.h>18#include <stdlib.h>19 20int llvm_object_list_sections(void) {21 LLVMMemoryBufferRef MB;22 LLVMBinaryRef O;23 LLVMSectionIteratorRef sect;24 25 char *outBufferErr = NULL;26 if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {27 fprintf(stderr, "Error reading file: %s\n", outBufferErr);28 free(outBufferErr);29 exit(1);30 }31 32 char *outBinaryErr = NULL;33 O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr);34 if (!O || outBinaryErr) {35 fprintf(stderr, "Error reading object: %s\n", outBinaryErr);36 free(outBinaryErr);37 exit(1);38 }39 40 sect = LLVMObjectFileCopySectionIterator(O);41 while (sect && !LLVMObjectFileIsSectionIteratorAtEnd(O, sect)) {42 printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect),43 LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect));44 45 LLVMMoveToNextSection(sect);46 }47 48 LLVMDisposeSectionIterator(sect);49 50 LLVMDisposeBinary(O);51 52 LLVMDisposeMemoryBuffer(MB);53 54 return 0;55}56 57int llvm_object_list_symbols(void) {58 LLVMMemoryBufferRef MB;59 LLVMBinaryRef O;60 LLVMSectionIteratorRef sect;61 LLVMSymbolIteratorRef sym;62 63 char *outBufferErr = NULL;64 if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {65 fprintf(stderr, "Error reading file: %s\n", outBufferErr);66 free(outBufferErr);67 exit(1);68 }69 70 char *outBinaryErr = NULL;71 O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr);72 if (!O || outBinaryErr) {73 fprintf(stderr, "Error reading object: %s\n", outBinaryErr);74 free(outBinaryErr);75 exit(1);76 }77 78 sect = LLVMObjectFileCopySectionIterator(O);79 sym = LLVMObjectFileCopySymbolIterator(O);80 while (sect && sym && !LLVMObjectFileIsSymbolIteratorAtEnd(O, sym)) {81 82 LLVMMoveToContainingSection(sect, sym);83 printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),84 LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),85 LLVMGetSectionName(sect));86 87 LLVMMoveToNextSymbol(sym);88 }89 90 LLVMDisposeSymbolIterator(sym);91 92 LLVMDisposeBinary(O);93 94 LLVMDisposeMemoryBuffer(MB);95 96 return 0;97}98