| /*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\ | |
| |* *| | |
| |* The LLVM Compiler Infrastructure *| | |
| |* *| | |
| |* This file is distributed under the University of Illinois Open Source *| | |
| |* License. See LICENSE.TXT for details. *| | |
| |* *| | |
| |*===----------------------------------------------------------------------===*| | |
| |* *| | |
| |* 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; | |
| LLVMObjectFileRef O; | |
| LLVMSectionIteratorRef sect; | |
| char *msg = NULL; | |
| if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { | |
| fprintf(stderr, "Error reading file: %s\n", msg); | |
| exit(1); | |
| } | |
| O = LLVMCreateObjectFile(MB); | |
| if (!O) { | |
| fprintf(stderr, "Error reading object\n"); | |
| exit(1); | |
| } | |
| sect = LLVMGetSections(O); | |
| while (!LLVMIsSectionIteratorAtEnd(O, sect)) { | |
| printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect), | |
| LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect)); | |
| LLVMMoveToNextSection(sect); | |
| } | |
| LLVMDisposeSectionIterator(sect); | |
| LLVMDisposeObjectFile(O); | |
| return 0; | |
| } | |
| int llvm_object_list_symbols(void) { | |
| LLVMMemoryBufferRef MB; | |
| LLVMObjectFileRef O; | |
| LLVMSectionIteratorRef sect; | |
| LLVMSymbolIteratorRef sym; | |
| char *msg = NULL; | |
| if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { | |
| fprintf(stderr, "Error reading file: %s\n", msg); | |
| exit(1); | |
| } | |
| O = LLVMCreateObjectFile(MB); | |
| if (!O) { | |
| fprintf(stderr, "Error reading object\n"); | |
| exit(1); | |
| } | |
| sect = LLVMGetSections(O); | |
| sym = LLVMGetSymbols(O); | |
| while (!LLVMIsSymbolIteratorAtEnd(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); | |
| LLVMDisposeObjectFile(O); | |
| return 0; | |
| } |