summaryrefslogtreecommitdiff
path: root/tools/llvm-c-test/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-c-test/object.c')
-rw-r--r--tools/llvm-c-test/object.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/tools/llvm-c-test/object.c b/tools/llvm-c-test/object.c
new file mode 100644
index 0000000000..c94e3af3b0
--- /dev/null
+++ b/tools/llvm-c-test/object.c
@@ -0,0 +1,85 @@
+/*===-- 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 object_list_sections(void) {
+ LLVMMemoryBufferRef MB;
+ LLVMObjectFileRef O;
+ 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);
+ }
+
+ LLVMSectionIteratorRef 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 object_list_symbols(void) {
+ LLVMMemoryBufferRef MB;
+ LLVMObjectFileRef O;
+ 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);
+ }
+
+ LLVMSectionIteratorRef sect = LLVMGetSections(O);
+ LLVMSymbolIteratorRef sym = LLVMGetSymbols(O);
+ while (!LLVMIsSymbolIteratorAtEnd(O, sym)) {
+
+ LLVMMoveToContainingSection(sect, sym);
+ printf("%s @0x%08" PRIx64 "/0x%08" PRIx64 " +%" PRIu64 " (%s)\n",
+ LLVMGetSymbolName(sym), LLVMGetSymbolAddress(sym),
+ LLVMGetSymbolFileOffset(sym), LLVMGetSymbolSize(sym),
+ LLVMGetSectionName(sect));
+
+ LLVMMoveToNextSymbol(sym);
+ }
+
+ LLVMDisposeSymbolIterator(sym);
+
+ LLVMDisposeObjectFile(O);
+
+ return 0;
+}