/* Copyright (C) 2000, 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

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

   The GNU C Library 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "vismod.h"

/* Prototype for our test function.  */
extern int do_test (void);

#define TEST_FUNCTION do_test ()

/* This defines the `main' function and some more.  */
#include <test-skeleton.c>


/* Prototypes for local functions.  */
extern int protlocal (void);

const char *protvarlocal = __FILE__;
extern const char *protvarinmod;
extern const char *protvaritcpt;

int
do_test (void)
{
  int res = 0;
  int val;

  /* First test: check whether .protected is handled correctly by the
     assembler/linker.  The uses of `protlocal' in the DSOs and in the
     main program should all be resolved with the local definitions.  */
  val = protlocal () + calllocal1 () + calllocal2 ();
  if (val != 0x155)
    {
      puts ("\
The handling of `.protected' seems to be implemented incorrectly: giving up");
      abort ();
    }
  puts ("`.protected' seems to be handled correctly, good!");

  /* Function pointers: for functions which are marked local and for
     which definitions are available all function pointers must be
     distinct.  */
  if (protlocal == getlocal1 ())
    {
      puts ("`protlocal' in main and mod1 have same address");
      res = 1;
    }
  if (protlocal == getlocal2 ())
    {
      puts ("`protlocal' in main and mod2 have same address");
      res = 1;
    }
  if (getlocal1 () == getlocal2 ())
    {
      puts ("`protlocal' in mod1 and mod2 have same address");
      res = 1;
    }
  if (getlocal1 () () + getlocal2 () () != 0x44)
    {
      puts ("pointers to `protlocal' in mod1 or mod2 incorrect");
      res = 1;
    }

  /* Next test.  This is similar to the last one but the function we
     are calling is not defined in the main object.  This means that
     the invocation in the main object uses the definition in the
     first DSO.  */
  if (protinmod != getinmod1 ())
    {
      printf ("&protinmod in main (%p) != &protinmod in mod1 (%p)\n",
	      protinmod, getinmod1 ());
      res = 1;
    }
  if (protinmod == getinmod2 ())
    {
      puts ("`protinmod' in main and mod2 have same address");
      res = 1;
    }
  if (getinmod1 () == getinmod2 ())
    {
      puts ("`protinmod' in mod1 and mod2 have same address");
      res = 1;
    }
  if (protinmod () + getinmod1 () () + getinmod2 () () != 0x4800)
    {
      puts ("pointers to `protinmod' in mod1 or mod2 incorrect");
      res = 1;
    }
  val = protinmod () + callinmod1 () + callinmod2 ();
  if (val != 0x15800)
    {
      printf ("calling of `protinmod' leads to wrong result (%#x)\n", val);
      res = 1;
    }

  /* A very similar text.  Same setup for the main object and the modules
     but this time we have another definition in a preloaded module. This
     one intercepts the references from the main object.  */
  if (protitcpt != getitcpt3 ())
    {
      printf ("&protitcpt in main (%p) != &protitcpt in mod3 (%p)\n",
	      &protitcpt, getitcpt3 ());
      res = 1;
    }
  if (protitcpt == getitcpt1 ())
    {
      puts ("`protitcpt' in main and mod1 have same address");
      res = 1;
    }
  if (protitcpt == getitcpt2 ())
    {
      puts ("`protitcpt' in main and mod2 have same address");
      res = 1;
    }
  if (getitcpt1 () == getitcpt2 ())
    {
      puts ("`protitcpt' in mod1 and mod2 have same address");
      res = 1;
    }
  val = protitcpt () + getitcpt1 () () + getitcpt2 () () + getitcpt3 () ();
  if (val != 0x8440000)
    {
      printf ("\
pointers to `protitcpt' in mod1 or mod2 or mod3 incorrect (%#x)\n", val);
      res = 1;
    }
  val = protitcpt () + callitcpt1 () + callitcpt2 () + callitcpt3 ();
  if (val != 0x19540000)
    {
      printf ("calling of `protitcpt' leads to wrong result (%#x)\n", val);
      res = 1;
    }

  /* Now look at variables.  First a variable which is available
     everywhere.  We must have three different addresses.  */
  if (&protvarlocal == getvarlocal1 ())
    {
      puts ("`protvarlocal' in main and mod1 have same address");
      res = 1;
    }
  if (&protvarlocal == getvarlocal2 ())
    {
      puts ("`protvarlocal' in main and mod2 have same address");
      res = 1;
    }
  if (getvarlocal1 () == getvarlocal2 ())
    {
      puts ("`protvarlocal' in mod1 and mod2 have same address");
      res = 1;
    }
  if (strcmp (protvarlocal, __FILE__) != 0)
    {
      puts ("`protvarlocal in main has wrong value");
      res = 1;
    }
  if (strcmp (*getvarlocal1 (), "vismod1.c") != 0)
    {
      puts ("`getvarlocal1' returns wrong value");
      res = 1;
    }
  if (strcmp (*getvarlocal2 (), "vismod2.c") != 0)
    {
      puts ("`getvarlocal2' returns wrong value");
      res = 1;
    }

  /* Now the case where there is no local definition.  */
  if (&protvarinmod != getvarinmod1 ())
    {
      printf ("&protvarinmod in main (%p) != &protitcpt in mod1 (%p)\n",
	      &protvarinmod, getvarinmod1 ());
      // XXX Possibly enable once fixed.
      // res = 1;
    }
  if (&protvarinmod == getvarinmod2 ())
    {
      puts ("`protvarinmod' in main and mod2 have same address");
      res = 1;
    }
  if (strcmp (*getvarinmod1 (), "vismod1.c") != 0)
    {
      puts ("`getvarinmod1' returns wrong value");
      res = 1;
    }
  if (strcmp (*getvarinmod2 (), "vismod2.c") != 0)
    {
      puts ("`getvarinmod2' returns wrong value");
      res = 1;
    }

  /* And a test where a variable definition is intercepted.  */
  if (&protvaritcpt == getvaritcpt1 ())
    {
      puts ("`protvaritcpt' in main and mod1 have same address");
      res = 1;
    }
  if (&protvaritcpt == getvaritcpt2 ())
    {
      puts ("`protvaritcpt' in main and mod2 have same address");
      res = 1;
    }
  if (&protvaritcpt != getvaritcpt3 ())
    {
      printf ("&protvaritcpt in main (%p) != &protvaritcpt in mod3 (%p)\n",
	      &protvaritcpt, getvaritcpt3 ());
      // XXX Possibly enable once fixed.
      // res = 1;
    }
  if (getvaritcpt1 () == getvaritcpt2 ())
    {
      puts ("`protvaritcpt' in mod1 and mod2 have same address");
      res = 1;
    }
  if (strcmp (protvaritcpt, "vismod3.c") != 0)
    {
      puts ("`protvaritcpt in main has wrong value");
      res = 1;
    }
  if (strcmp (*getvaritcpt1 (), "vismod1.c") != 0)
    {
      puts ("`getvaritcpt1' returns wrong value");
      res = 1;
    }
  if (strcmp (*getvaritcpt2 (), "vismod2.c") != 0)
    {
      puts ("`getvaritcpt2' returns wrong value");
      res = 1;
    }

  return res;
}


int
protlocal (void)
{
  return 0x1;
}
