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