summaryrefslogtreecommitdiff
path: root/tools/llvm-c-test/object.c
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2013-12-22 00:04:03 +0000
committerDimitry Andric <dim@FreeBSD.org>2013-12-22 00:04:03 +0000
commitf8af5cf600354830d4ccf59732403f0f073eccb9 (patch)
tree2ba0398b4c42ad4f55561327538044fd2c925a8b /tools/llvm-c-test/object.c
parent59d6cff90eecf31cb3dd860c4e786674cfdd42eb (diff)
Diffstat (limited to 'tools/llvm-c-test/object.c')
-rw-r--r--tools/llvm-c-test/object.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/llvm-c-test/object.c b/tools/llvm-c-test/object.c
new file mode 100644
index 0000000000000..2792928654208
--- /dev/null
+++ b/tools/llvm-c-test/object.c
@@ -0,0 +1,88 @@
+/*===-- 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;
+ 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 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 "/0x%08" PRIx64 " +%" PRIu64 " (%s)\n",
+ LLVMGetSymbolName(sym), LLVMGetSymbolAddress(sym),
+ LLVMGetSymbolFileOffset(sym), LLVMGetSymbolSize(sym),
+ LLVMGetSectionName(sect));
+
+ LLVMMoveToNextSymbol(sym);
+ }
+
+ LLVMDisposeSymbolIterator(sym);
+
+ LLVMDisposeObjectFile(O);
+
+ return 0;
+}