|  | /*===-- 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 <stdio.h> | 
|  | #include <stdlib.h> | 
|  |  | 
|  | 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; | 
|  | } |