Add llvm-c-test tool for testing llvm-c
[oota-llvm.git] / tools / llvm-c-test / object.c
diff --git a/tools/llvm-c-test/object.c b/tools/llvm-c-test/object.c
new file mode 100644 (file)
index 0000000..c94e3af
--- /dev/null
@@ -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;
+}