/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\
|*                                                                            *|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
|* Exceptions.                                                                *|
|* See https://llvm.org/LICENSE.txt for license information.                  *|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
|*                                                                            *|
|*===----------------------------------------------------------------------===*|
|*                                                                            *|
|* 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 llvm_object_list_sections(void) {
  LLVMMemoryBufferRef MB;
  LLVMSectionIteratorRef sect;

  char *outBufferErr = NULL;
  if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
    fprintf(stderr, "Error reading file: %s\n", outBufferErr);
    free(outBufferErr);
    exit(1);
  }

  char *outBinaryErr = NULL;
  LLVMContextRef C = LLVMContextCreate();
  LLVMBinaryRef O = LLVMCreateBinary(MB, C, &outBinaryErr);
  if (!O || outBinaryErr) {
    fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
    free(outBinaryErr);
    exit(1);
  }

  sect = LLVMObjectFileCopySectionIterator(O);
  while (sect && !LLVMObjectFileIsSectionIteratorAtEnd(O, sect)) {
    printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect),
           LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect));

    LLVMMoveToNextSection(sect);
  }

  LLVMDisposeSectionIterator(sect);

  LLVMDisposeBinary(O);

  LLVMDisposeMemoryBuffer(MB);
  LLVMContextDispose(C);

  return 0;
}

int llvm_object_list_symbols(void) {
  LLVMMemoryBufferRef MB;
  LLVMSectionIteratorRef sect;
  LLVMSymbolIteratorRef sym;

  char *outBufferErr = NULL;
  if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
    fprintf(stderr, "Error reading file: %s\n", outBufferErr);
    free(outBufferErr);
    exit(1);
  }

  char *outBinaryErr = NULL;
  LLVMContextRef C = LLVMContextCreate();
  LLVMBinaryRef O = LLVMCreateBinary(MB, C, &outBinaryErr);
  if (!O || outBinaryErr) {
    fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
    free(outBinaryErr);
    exit(1);
  }

  sect = LLVMObjectFileCopySectionIterator(O);
  sym = LLVMObjectFileCopySymbolIterator(O);
  while (sect && sym && !LLVMObjectFileIsSymbolIteratorAtEnd(O, sym)) {

    LLVMMoveToContainingSection(sect, sym);
    printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),
           LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),
           LLVMGetSectionName(sect));

    LLVMMoveToNextSymbol(sym);
  }

  LLVMDisposeSymbolIterator(sym);

  LLVMDisposeBinary(O);

  LLVMDisposeMemoryBuffer(MB);
  LLVMContextDispose(C);

  return 0;
}
