/* Test program for libdwfl basic module tracking, relocation.
   Copyright (C) 2007 Red Hat, Inc.
   This file is part of elfutils.

   This file is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   elfutils is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <config.h>
#include <assert.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdio_ext.h>
#include <error.h>
#include <locale.h>
#include ELFUTILS_HEADER(dwfl)


static const Dwfl_Callbacks offline_callbacks =
  {
    .find_debuginfo = INTUSE(dwfl_standard_find_debuginfo),
    .section_address = INTUSE(dwfl_offline_section_address),
  };


int
main (void)
{
  /* We use no threads here which can interfere with handling a stream.  */
  (void) __fsetlocking (stdout, FSETLOCKING_BYCALLER);

  /* Set locale.  */
  (void) setlocale (LC_ALL, "");

  Dwfl *dwfl = dwfl_begin (&offline_callbacks);
  assert (dwfl != NULL);

  Dwfl_Module *high = dwfl_report_module (dwfl, "high",
					  UINT64_C (0xffffffff00010000),
					  UINT64_C (0xffffffff00020000));
  assert (high);
  Dwfl_Module *low = dwfl_report_module (dwfl, "low",
					 UINT64_C (0x00010000),
					 UINT64_C (0x00020000));
  assert (low);
  Dwfl_Module *middle = dwfl_report_module (dwfl, "middle",
					    UINT64_C (0xffff00010000),
					    UINT64_C (0xffff00020000));
  assert (middle);

  int ret = dwfl_report_end (dwfl, NULL, NULL);
  assert (ret == 0);

  Dwfl_Module *mod = dwfl_addrmodule (dwfl, UINT64_C (0xffffffff00010123));
  assert (mod == high);
  mod = dwfl_addrmodule (dwfl, UINT64_C (0x00010123));
  assert (mod == low);
  mod = dwfl_addrmodule (dwfl, UINT64_C (0xffff00010123));
  assert (mod == middle);

  dwfl_end (dwfl);

  return 0;
}
