brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 53ffb1a Raw
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