/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\ |* *| |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| |* Exceptions. *| |* See https://llvm.org/LICENSE.txt for license information. *| |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| |* *| |*===----------------------------------------------------------------------===*| |* *| |* This file implements the --object-list-sections and --object-list-symbols *| |* commands in llvm-c-test. *| |* *| \*===----------------------------------------------------------------------===*/ #include "llvm-c-test.h" #include "llvm-c/Object.h" #include #include int llvm_object_list_sections(void) { LLVMMemoryBufferRef MB; LLVMBinaryRef O; LLVMSectionIteratorRef sect; char *outBufferErr = NULL; if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) { fprintf(stderr, "Error reading file: %s\n", outBufferErr); free(outBufferErr); exit(1); } char *outBinaryErr = NULL; O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr); if (!O || outBinaryErr) { fprintf(stderr, "Error reading object: %s\n", outBinaryErr); free(outBinaryErr); exit(1); } sect = LLVMObjectFileCopySectionIterator(O); while (sect && !LLVMObjectFileIsSectionIteratorAtEnd(O, sect)) { printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect), LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect)); LLVMMoveToNextSection(sect); } LLVMDisposeSectionIterator(sect); LLVMDisposeBinary(O); LLVMDisposeMemoryBuffer(MB); return 0; } int llvm_object_list_symbols(void) { LLVMMemoryBufferRef MB; LLVMBinaryRef O; LLVMSectionIteratorRef sect; LLVMSymbolIteratorRef sym; char *outBufferErr = NULL; if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) { fprintf(stderr, "Error reading file: %s\n", outBufferErr); free(outBufferErr); exit(1); } char *outBinaryErr = NULL; O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr); if (!O || outBinaryErr) { fprintf(stderr, "Error reading object: %s\n", outBinaryErr); free(outBinaryErr); exit(1); } sect = LLVMObjectFileCopySectionIterator(O); sym = LLVMObjectFileCopySymbolIterator(O); while (sect && sym && !LLVMObjectFileIsSymbolIteratorAtEnd(O, sym)) { LLVMMoveToContainingSection(sect, sym); printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym), LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym), LLVMGetSectionName(sect)); LLVMMoveToNextSymbol(sym); } LLVMDisposeSymbolIterator(sym); LLVMDisposeBinary(O); LLVMDisposeMemoryBuffer(MB); return 0; }