aboutsummaryrefslogtreecommitdiffstats
path: root/tools/llvm-c-test/object.c
diff options
context:
space:
mode:
authorStephen Hines <srhines@google.com>2014-02-11 20:01:10 -0800
committerStephen Hines <srhines@google.com>2014-02-11 20:01:10 -0800
commitce9904c6ea8fd669978a8eefb854b330eb9828ff (patch)
tree2418ee2e96ea220977c8fb74959192036ab5b133 /tools/llvm-c-test/object.c
parentc27b10b198c1d9e9b51f2303994313ec2778edd7 (diff)
parentdbb832b83351cec97b025b61c26536ef50c3181c (diff)
downloadexternal_llvm-ce9904c6ea8fd669978a8eefb854b330eb9828ff.zip
external_llvm-ce9904c6ea8fd669978a8eefb854b330eb9828ff.tar.gz
external_llvm-ce9904c6ea8fd669978a8eefb854b330eb9828ff.tar.bz2
Merge remote-tracking branch 'upstream/release_34' into merge-20140211
Conflicts: lib/Linker/LinkModules.cpp lib/Support/Unix/Signals.inc Change-Id: Ia54f291fa5dc828052d2412736e8495c1282aa64
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 0000000..2792928
--- /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;
+}