12bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\ 22bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* *| 32bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* The LLVM Compiler Infrastructure *| 42bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* *| 52bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* This file is distributed under the University of Illinois Open Source *| 62bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* License. See LICENSE.TXT for details. *| 72bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* *| 82bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|*===----------------------------------------------------------------------===*| 92bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* *| 102bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* This file implements the --object-list-sections and --object-list-symbols *| 112bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* commands in llvm-c-test. *| 122bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg|* *| 132bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg\*===----------------------------------------------------------------------===*/ 142bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 152bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg#include "llvm-c-test.h" 162bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg#include "llvm-c/Object.h" 172bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg#include <stdio.h> 182bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg#include <stdlib.h> 192bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarint llvm_object_list_sections(void) { 212bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMMemoryBufferRef MB; 222bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMObjectFileRef O; 2390fd79a222652126ee7d85f3afb2cd85aa51b2f9NAKAMURA Takumi LLVMSectionIteratorRef sect; 242bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg char *msg = NULL; 252bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 262bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { 272bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg fprintf(stderr, "Error reading file: %s\n", msg); 282bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg exit(1); 292bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg } 302bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 312bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg O = LLVMCreateObjectFile(MB); 322bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg if (!O) { 332bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg fprintf(stderr, "Error reading object\n"); 342bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg exit(1); 352bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg } 362bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 3790fd79a222652126ee7d85f3afb2cd85aa51b2f9NAKAMURA Takumi sect = LLVMGetSections(O); 382bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg while (!LLVMIsSectionIteratorAtEnd(O, sect)) { 392bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect), 402bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect)); 412bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 422bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMMoveToNextSection(sect); 432bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg } 442bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 452bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMDisposeSectionIterator(sect); 462bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 472bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMDisposeObjectFile(O); 482bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 492bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg return 0; 502bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg} 512bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarint llvm_object_list_symbols(void) { 532bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMMemoryBufferRef MB; 542bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMObjectFileRef O; 5590fd79a222652126ee7d85f3afb2cd85aa51b2f9NAKAMURA Takumi LLVMSectionIteratorRef sect; 5690fd79a222652126ee7d85f3afb2cd85aa51b2f9NAKAMURA Takumi LLVMSymbolIteratorRef sym; 572bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg char *msg = NULL; 582bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 592bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { 602bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg fprintf(stderr, "Error reading file: %s\n", msg); 612bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg exit(1); 622bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg } 632bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 642bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg O = LLVMCreateObjectFile(MB); 652bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg if (!O) { 662bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg fprintf(stderr, "Error reading object\n"); 672bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg exit(1); 682bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg } 692bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 7090fd79a222652126ee7d85f3afb2cd85aa51b2f9NAKAMURA Takumi sect = LLVMGetSections(O); 7190fd79a222652126ee7d85f3afb2cd85aa51b2f9NAKAMURA Takumi sym = LLVMGetSymbols(O); 722bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg while (!LLVMIsSymbolIteratorAtEnd(O, sym)) { 732bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 742bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMMoveToContainingSection(sect, sym); 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym), 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym), 772bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMGetSectionName(sect)); 782bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 792bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMMoveToNextSymbol(sym); 802bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg } 812bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 822bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMDisposeSymbolIterator(sym); 832bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 842bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg LLVMDisposeObjectFile(O); 852bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg 862bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg return 0; 872bef1a6b25d938210547cd0f5ba4a08abdad2583Anders Waldenborg} 88