#ifdef PROTECTED_CHECK
#include <features.h>
#include <stdio.h>

int
main (void)
{
#if defined (__GLIBC__) && (__GLIBC__ > 2 \
			    || (__GLIBC__ == 2 \
				&&  __GLIBC_MINOR__ >= 2))
  puts ("yes");
#else
  puts ("no");
#endif
  return 0;
}
#else
/* This is the main program for the shared library test.  */

#include <stdio.h>

int mainvar = 1;
int overriddenvar = 2;
extern int shlibvar1;

extern int shlib_mainvar ();
extern int shlib_overriddenvar ();
extern int shlib_shlibvar1 ();
extern int shlib_shlibvar2 ();
extern int shlib_shlibcall ();
extern int shlib_maincall ();
extern int shlib_checkfunptr1 ();
extern int shlib_checkfunptr2 ();
extern int (*shlib_getfunptr1 ()) ();
extern int (*shlib_getfunptr2 ()) ();
extern int shlib_check ();
extern int shlib_shlibcall2 ();
extern int visibility_check ();
extern int visibility_checkfunptr ();
extern void *visibility_funptr ();
extern int visibility_checkvar ();
extern int visibility_checkvarptr ();
extern int visibility_varval ();
extern void *visibility_varptr ();
extern int shlib_visibility_checkcom ();
extern int shlib_visibility_checkweak ();

int shlib_visibility_com = 1;

int shlib_visibility_var_weak = 1;

int
shlib_visibility_func_weak ()
{
  return 1;
}

#ifdef HIDDEN_WEAK_TEST
#define WEAK_TEST
#endif

#ifdef PROTECTED_WEAK_TEST
#define WEAK_TEST
#endif

#ifdef PROTECTED_UNDEF_TEST
#define PROTECTED_TEST
#endif

#ifndef WEAK_TEST
extern int visibility ();
extern int visibility_var;
#endif

#if !defined (HIDDEN_TEST) && defined (PROTECTED_TEST)
int
visibility (void)
{
  return 1;
}

static int
main_visibility_check (void)
{
  return ((int (*) (void)) visibility_funptr ()) != visibility;
}

int visibility_var = 1;

static int
main_visibility_checkvar (void)
{
  return visibility_varval () != visibility_var
	 && visibility_varptr () != &visibility_var;
}

#ifndef PROTECTED_UNDEF_TEST
int shared_data = 1;
asm (".protected shared_data");

int
shared_func (void)
{
  return 1;
}

asm (".protected shared_func");

extern int * shared_data_p ();
typedef int (*func) ();
extern func shared_func_p ();
#endif
#else
static int
main_visibility_check (void)
{
#ifdef WEAK_TEST
  return visibility_funptr () == NULL;
#else
  return ((int (*) (void)) visibility_funptr ()) == visibility;
#endif
}

static int
main_visibility_checkvar (void)
{
#ifdef WEAK_TEST
  return visibility_varval () == 0
	 && visibility_varptr () == NULL;
#else
  return visibility_varval () == visibility_var
	 && visibility_varptr () == &visibility_var;
#endif
}
#endif

/* This function is called by the shared library.  */

int
main_called (void)
{
  return 6;
}

/* This function overrides a function in the shared library.  */

int
shlib_overriddencall2 (void)
{
  return 8;
}

#ifdef HIDDEN_NORMAL_TEST
int visibility_com;
asm (".hidden visibility_com");

int
main_visibility_checkcom (void)
{
  return visibility_com == 0;
}

int
main_visibility_checkweak (void)
{
  return 1;
}
#elif defined (HIDDEN_WEAK_TEST)
int
main_visibility_checkcom (void)
{
  return 1;
}

#pragma weak visibility_undef_var_weak
extern int visibility_undef_var_weak;
asm (".hidden visibility_undef_var_weak");

#pragma weak visibility_undef_func_weak
extern int visibility_undef_func_weak ();
asm (".hidden visibility_undef_func_weak");

#pragma weak visibility_var_weak
extern int visibility_var_weak;
asm (".hidden visibility_var_weak");

#pragma weak visibility_func_weak
extern int visibility_func_weak ();
asm (".hidden visibility_func_weak");

int
main_visibility_checkweak ()
{
  return &visibility_undef_var_weak == NULL
	 && &visibility_undef_func_weak == NULL
	 && &visibility_func_weak == NULL
	 && &visibility_var_weak == NULL;
}
#elif defined (HIDDEN_UNDEF_TEST)
extern int visibility_def;
asm (".hidden visibility_def");
extern int visibility_func ();
asm (".hidden visibility_func");

int
main_visibility_checkcom (void)
{
  return visibility_def == 2;
}

int
main_visibility_checkweak (void)
{
  return visibility_func () == 2;
}
#else
int
main_visibility_checkcom (void)
{
  return 1;
}

int
main_visibility_checkweak (void)
{
  return 1;
}
#endif

int
main (void)
{
  int (*p) ();
  int ret = 0;

  printf ("mainvar == %d\n", mainvar);
  printf ("overriddenvar == %d\n", overriddenvar);
  printf ("shlibvar1 == %d\n", shlibvar1);
#ifndef XCOFF_TEST
  printf ("shlib_mainvar () == %d\n", shlib_mainvar ());
  printf ("shlib_overriddenvar () == %d\n", shlib_overriddenvar ());
#endif
  printf ("shlib_shlibvar1 () == %d\n", shlib_shlibvar1 ());
  printf ("shlib_shlibvar2 () == %d\n", shlib_shlibvar2 ());
  printf ("shlib_shlibcall () == %d\n", shlib_shlibcall ());
#ifndef XCOFF_TEST
  printf ("shlib_shlibcall2 () == %d\n", shlib_shlibcall2 ());
  printf ("shlib_maincall () == %d\n", shlib_maincall ());
#endif
  printf ("main_called () == %d\n", main_called ());
  printf ("shlib_checkfunptr1 (shlib_shlibvar1) == %d\n",
	  shlib_checkfunptr1 (shlib_shlibvar1));
#ifndef XCOFF_TEST
  printf ("shlib_checkfunptr2 (main_called) == %d\n",
	  shlib_checkfunptr2 (main_called));
#endif
  p = shlib_getfunptr1 ();
  printf ("shlib_getfunptr1 () ");
  if (p == shlib_shlibvar1)
    printf ("==");
  else
    printf ("!=");
  printf (" shlib_shlibvar1\n");
#ifndef XCOFF_TEST
  p = shlib_getfunptr2 ();
  printf ("shlib_getfunptr2 () ");
  if (p == main_called)
    printf ("==");
  else
    printf ("!=");
  printf (" main_called\n");
#endif
  printf ("shlib_check () == %d\n", shlib_check ());
  printf ("visibility_check () == %d\n", visibility_check ());
  printf ("visibility_checkfunptr () == %d\n",
	  visibility_checkfunptr ());
  printf ("main_visibility_check () == %d\n", main_visibility_check ());
  printf ("visibility_checkvar () == %d\n", visibility_checkvar ());
  printf ("visibility_checkvarptr () == %d\n",
	  visibility_checkvarptr ());
  printf ("main_visibility_checkvar () == %d\n",
	  main_visibility_checkvar ());
  printf ("main_visibility_checkcom () == %d\n",
	  main_visibility_checkcom ());
  printf ("shlib_visibility_checkcom () == %d\n",
	  shlib_visibility_checkcom ());
  printf ("main_visibility_checkweak () == %d\n",
	  main_visibility_checkweak ());
  printf ("shlib_visibility_checkweak () == %d\n",
	  shlib_visibility_checkweak ());

#if !defined (PROTECTED_UNDEF_TEST) && defined (PROTECTED_TEST)
  if (&shared_data != shared_data_p ())
    ret = 1;
  p = shared_func_p ();
  if (shared_func != p)
    ret = 1;
  if (shared_data != *shared_data_p ())
    ret = 1;
  if (shared_func () != (*p) () )
    ret = 1;
#endif

  return ret;
}
#endif
