// Copyright (C) 2012-2021 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library 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, or (at your option)
// any later version.

// This 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 General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/* This is part of the vtable verification runtime library.  For more
   information about this feature, see the comments in libvtv/vtv_rts.cc.  */

/* The functions in this file are used to create the libvtv_stubs
   library, as part of the vtable verification feature.  When building
   a binary without vtable verification, and linking it with a
   (possibly pre-built third-party) library that was built with
   verification, it is possible that vtable verification will fail due
   to incomplete data (rather than due to corrupt vtable pointers).  In
   this case we need to give programmers a way of turning off the
   vtable verification in their libraries.  They can do so by linking
   with the libvtv_stubs library, which (as you can see) will replace
   the real verification functions with a set of functions that do
   nothing (so no more verification failures/aborts).  */

#include <cstddef>

/* weak symbols on Windows work differently than on Linux. To be able
   to switch vtv on and off on Windows two dlls are built. One with
   the sources from libvtv, the other from these stubs. Depending on
   which dll is placed in the folder of the executable the functions
   from libvtv or the stubs functions are used. */
#if defined (__CYGWIN__) || defined (__MINGW32__)
extern "C"
void
__VLTChangePermission(int);

void
__VLTRegisterSet(void**, const void*, std::size_t, std::size_t,
		 void**);

void
__VLTRegisterPair(void**, const void*, std::size_t,
		  const void*);

const void*
__VLTVerifyVtablePointer(void**, const void*);

void
__VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t,
		      void**);

void
__VLTRegisterPairDebug(void**, const void*, std::size_t, const void*,
		       const char*, const char*);

const void*
__VLTVerifyVtablePointerDebug(void**, const void*, const char*,
			      const char*);
#else
// Declare as weak for libsupc++, strong definitions are in libvtv.
#if __GXX_WEAK__
extern "C"
void
__VLTChangePermission(int) __attribute__((weak));

void
__VLTRegisterSet(void**, const void*, std::size_t, std::size_t,
		 void**) __attribute__((weak));

void
__VLTRegisterPair(void**, const void*, std::size_t,
		  const void*) __attribute__((weak));

const void*
__VLTVerifyVtablePointer(void**, const void*) __attribute__((weak));

void
__VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t,
		      void**) __attribute__((weak));

void
__VLTRegisterPairDebug(void**, const void*, std::size_t, const void*,
		       const char*, const char*) __attribute__((weak));

const void*
__VLTVerifyVtablePointerDebug(void**, const void*, const char*,
			      const char*) __attribute__((weak));
#endif
#endif

// Stub definitions.
extern "C"
void
__VLTChangePermission(int)
{ }

void
__VLTRegisterSet(void**, const void*, std::size_t, std::size_t, void**)
{ }

void
__VLTRegisterPair(void**, const void*, std::size_t, const void*)
{ }

const void*
__VLTVerifyVtablePointer(void**, const void* vtable_ptr)
{ return vtable_ptr; }

void
__VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t, void**)
{ }

void
__VLTRegisterPairDebug(void**, const void*, std::size_t, const void*,
		       const char*, const  char*)
{ }

const void*
__VLTVerifyVtablePointerDebug(void**, const void* vtable_ptr, const char*,
			      const char*)
{ return vtable_ptr; }
