1/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\
2|*                                                                            *|
3|*                     The LLVM Compiler Infrastructure                       *|
4|*                                                                            *|
5|* This file is distributed under the University of Illinois Open Source      *|
6|* License. See LICENSE.TXT for details.                                      *|
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 object_list_sections(void) {
21  LLVMMemoryBufferRef MB;
22  LLVMObjectFileRef O;
23  LLVMSectionIteratorRef sect;
24  char *msg = NULL;
25
26  if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) {
27    fprintf(stderr, "Error reading file: %s\n", msg);
28    exit(1);
29  }
30
31  O = LLVMCreateObjectFile(MB);
32  if (!O) {
33    fprintf(stderr, "Error reading object\n");
34    exit(1);
35  }
36
37  sect = LLVMGetSections(O);
38  while (!LLVMIsSectionIteratorAtEnd(O, sect)) {
39    printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect),
40           LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect));
41
42    LLVMMoveToNextSection(sect);
43  }
44
45  LLVMDisposeSectionIterator(sect);
46
47  LLVMDisposeObjectFile(O);
48
49  return 0;
50}
51
52int object_list_symbols(void) {
53  LLVMMemoryBufferRef MB;
54  LLVMObjectFileRef O;
55  LLVMSectionIteratorRef sect;
56  LLVMSymbolIteratorRef sym;
57  char *msg = NULL;
58
59  if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) {
60    fprintf(stderr, "Error reading file: %s\n", msg);
61    exit(1);
62  }
63
64  O = LLVMCreateObjectFile(MB);
65  if (!O) {
66    fprintf(stderr, "Error reading object\n");
67    exit(1);
68  }
69
70  sect = LLVMGetSections(O);
71  sym = LLVMGetSymbols(O);
72  while (!LLVMIsSymbolIteratorAtEnd(O, sym)) {
73
74    LLVMMoveToContainingSection(sect, sym);
75    printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),
76           LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),
77           LLVMGetSectionName(sect));
78
79    LLVMMoveToNextSymbol(sym);
80  }
81
82  LLVMDisposeSymbolIterator(sym);
83
84  LLVMDisposeObjectFile(O);
85
86  return 0;
87}
88