
/* Check of variable location identification when using .debug_types.  */

/* Relevant compile flags are:

   -Wall -g -I$prefix/include/valgrind -gdwarf-4 -fdebug-types-section

   eg -Wall -g -I`pwd`/Inst/include/valgrind -gdwarf-4 -fdebug-types-section
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "tests/sys_mman.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "memcheck/memcheck.h"

/* Cause memcheck to complain about the address "a" and so to print
   its best guess as to what "a" actually is.*/
void croak ( void* aV )
{
  if(VALGRIND_CHECK_MEM_IS_ADDRESSABLE(aV,1) != 0)
     return;
  char* a = (char*)aV;
  char* undefp = malloc(1);
  char saved = *a;
  assert(undefp);
  *a = *undefp;
  (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1);
  *a = saved;
  free(undefp);
}

struct s1
{
  char c;
  short s;
  int i;
  long l;
  float f;
  double d;
};

struct s1 S2[30];

int main ( void )
{
  struct s1 local;
  struct s1* onheap = malloc(sizeof (struct s1));
  void *p, *q;
  int fd;
  int n;
  char filename[256];

  assert(onheap);
  croak(&onheap->i);

  croak( &S2[0].i );
  croak( &local.i );

  /* Describe anonymous mmap-ed */
  p = mmap( 0, 16 * 1024, PROT_READ|PROT_WRITE,
            MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 );
  assert(p != MAP_FAILED);
  croak( p);

  /* Describe file mmap-ed */
  snprintf(filename, sizeof(filename), "./valgrind-dw4-test.%d",
           getpid());

  unlink(filename);

  fd = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
  assert (fd > 0);
  n = write(fd, filename, strlen(filename));
  assert (n > 8);
  q = mmap(NULL, 100, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
  assert (q != MAP_FAILED);
  croak( q);
  unlink(filename);

  /* Describe memory in or past the heap end. */
  void *addr = sbrk(0);
  croak(addr); // in the first brk page, after brk_limit
  sbrk(4 * 1024); // increase brk segment
  croak(addr); // Now, must be inside.
  addr = (void *) ((char*)addr + 2 * 1024);
  croak(addr); // Must still be inside.
  sbrk(-3*1024);
  croak(addr); // Must now be after.
  
  return 0;
}
