/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 1.3.36
 * 
 * This file is not intended to be easily readable and contains a number of 
 * coding conventions designed to improve portability and efficiency. Do not make
 * changes to this file unless you know what you are doing--modify the SWIG 
 * interface file instead. 
 * ----------------------------------------------------------------------------- */


#ifdef __cplusplus
template<typename T> class SwigValueWrapper {
    T *tt;
public:
    SwigValueWrapper() : tt(0) { }
    SwigValueWrapper(const SwigValueWrapper<T>& rhs) : tt(new T(*rhs.tt)) { }
    SwigValueWrapper(const T& t) : tt(new T(t)) { }
    ~SwigValueWrapper() { delete tt; } 
    SwigValueWrapper& operator=(const T& t) { delete tt; tt = new T(t); return *this; }
    operator T&() const { return *tt; }
    T *operator&() { return tt; }
private:
    SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
};

template <typename T> T SwigValueInit() {
  return T();
}
#endif

/* -----------------------------------------------------------------------------
 *  This section contains generic SWIG labels for method/variable
 *  declarations/attributes, and other compiler dependent labels.
 * ----------------------------------------------------------------------------- */

/* template workaround for compilers that cannot correctly implement the C++ standard */
#ifndef SWIGTEMPLATEDISAMBIGUATOR
# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
#  define SWIGTEMPLATEDISAMBIGUATOR template
# elif defined(__HP_aCC)
/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
#  define SWIGTEMPLATEDISAMBIGUATOR template
# else
#  define SWIGTEMPLATEDISAMBIGUATOR
# endif
#endif

/* inline attribute */
#ifndef SWIGINLINE
# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
#   define SWIGINLINE inline
# else
#   define SWIGINLINE
# endif
#endif

/* attribute recognised by some compilers to avoid 'unused' warnings */
#ifndef SWIGUNUSED
# if defined(__GNUC__)
#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
#     define SWIGUNUSED __attribute__ ((__unused__)) 
#   else
#     define SWIGUNUSED
#   endif
# elif defined(__ICC)
#   define SWIGUNUSED __attribute__ ((__unused__)) 
# else
#   define SWIGUNUSED 
# endif
#endif

#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
#   define SWIGUNUSEDPARM(p)
# else
#   define SWIGUNUSEDPARM(p) p SWIGUNUSED 
# endif
#endif

/* internal SWIG method */
#ifndef SWIGINTERN
# define SWIGINTERN static SWIGUNUSED
#endif

/* internal inline SWIG method */
#ifndef SWIGINTERNINLINE
# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
#endif

/* exporting methods */
#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
#  ifndef GCC_HASCLASSVISIBILITY
#    define GCC_HASCLASSVISIBILITY
#  endif
#endif

#ifndef SWIGEXPORT
# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
#   if defined(STATIC_LINKED)
#     define SWIGEXPORT
#   else
#     define SWIGEXPORT __declspec(dllexport)
#   endif
# else
#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
#     define SWIGEXPORT __attribute__ ((visibility("default")))
#   else
#     define SWIGEXPORT
#   endif
# endif
#endif

/* calling conventions for Windows */
#ifndef SWIGSTDCALL
# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
#   define SWIGSTDCALL __stdcall
# else
#   define SWIGSTDCALL
# endif 
#endif

/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
# define _CRT_SECURE_NO_DEPRECATE
#endif

/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
# define _SCL_SECURE_NO_DEPRECATE
#endif



#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#if defined(_WIN32) || defined(__CYGWIN32__)
#  define DllExport   __declspec( dllexport )
#  define SWIGSTDCALL __stdcall
#else
#  define DllExport  
#  define SWIGSTDCALL
#endif 


#ifdef __cplusplus
#  include <new>
#endif




/* Support for throwing Ada exceptions from C/C++ */

typedef enum 
{
  SWIG_AdaException,
  SWIG_AdaOutOfMemoryException,
  SWIG_AdaIndexOutOfRangeException,
  SWIG_AdaDivideByZeroException,
  SWIG_AdaArgumentOutOfRangeException,
  SWIG_AdaNullReferenceException
} SWIG_AdaExceptionCodes;


typedef void (SWIGSTDCALL* SWIG_AdaExceptionCallback_t)(const char *);


typedef struct 
{
  SWIG_AdaExceptionCodes code;
  SWIG_AdaExceptionCallback_t callback;
} 
  SWIG_AdaExceptions_t;


static 
SWIG_AdaExceptions_t 
SWIG_ada_exceptions[] = 
{
  { SWIG_AdaException, NULL },
  { SWIG_AdaOutOfMemoryException, NULL },
  { SWIG_AdaIndexOutOfRangeException, NULL },
  { SWIG_AdaDivideByZeroException, NULL },
  { SWIG_AdaArgumentOutOfRangeException, NULL },
  { SWIG_AdaNullReferenceException, NULL } 
};


static 
void 
SWIG_AdaThrowException (SWIG_AdaExceptionCodes code, const char *msg) 
{
  SWIG_AdaExceptionCallback_t callback = SWIG_ada_exceptions[SWIG_AdaException].callback;
  if (code >=0 && (size_t)code < sizeof(SWIG_ada_exceptions)/sizeof(SWIG_AdaExceptions_t)) {
    callback = SWIG_ada_exceptions[code].callback;
  }
  callback(msg);
}



#ifdef __cplusplus
extern "C" 
#endif

DllExport void SWIGSTDCALL SWIGRegisterExceptionCallbacks_LLVM_Target (SWIG_AdaExceptionCallback_t systemException,
                                                                   SWIG_AdaExceptionCallback_t outOfMemory, 
                                                                   SWIG_AdaExceptionCallback_t indexOutOfRange, 
                                                                   SWIG_AdaExceptionCallback_t divideByZero, 
                                                                   SWIG_AdaExceptionCallback_t argumentOutOfRange,
                                                                   SWIG_AdaExceptionCallback_t nullReference) 
{
  SWIG_ada_exceptions [SWIG_AdaException].callback                   = systemException;
  SWIG_ada_exceptions [SWIG_AdaOutOfMemoryException].callback        = outOfMemory;
  SWIG_ada_exceptions [SWIG_AdaIndexOutOfRangeException].callback    = indexOutOfRange;
  SWIG_ada_exceptions [SWIG_AdaDivideByZeroException].callback       = divideByZero;
  SWIG_ada_exceptions [SWIG_AdaArgumentOutOfRangeException].callback = argumentOutOfRange;
  SWIG_ada_exceptions [SWIG_AdaNullReferenceException].callback      = nullReference;
}


/* Callback for returning strings to Ada without leaking memory */

typedef char * (SWIGSTDCALL* SWIG_AdaStringHelperCallback)(const char *);
static SWIG_AdaStringHelperCallback SWIG_ada_string_callback = NULL;



/* probably obsolete ...
#ifdef __cplusplus
extern "C" 
#endif
DllExport void SWIGSTDCALL SWIGRegisterStringCallback_LLVM_Target(SWIG_AdaStringHelperCallback callback) {
  SWIG_ada_string_callback = callback;
}
*/



/* Contract support */

#define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_AdaThrowException(SWIG_AdaArgumentOutOfRangeException, msg); return nullreturn; } else


#define protected public
#define private   public

#include "llvm-c/Target.h"



//  struct LLVMCtxt;


#undef protected
#undef private
#ifdef __cplusplus 
extern "C" {
#endif
DllExport void SWIGSTDCALL Ada_LLVMInitializeAllTargets (
  )
{
  LLVMInitializeAllTargets();
  
  
}



DllExport int SWIGSTDCALL Ada_LLVMInitializeNativeTarget (
  )
{
  int jresult ;
  int result;
  
  result = (int)LLVMInitializeNativeTarget();
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport void * SWIGSTDCALL Ada_LLVMCreateTargetData (
  char * jarg1
  )
{
  void * jresult ;
  char *arg1 = (char *) 0 ;
  LLVMTargetDataRef result;
  
  arg1 = jarg1; 
  
  result = (LLVMTargetDataRef)LLVMCreateTargetData((char const *)arg1);
  jresult = (void *) result;      
  
  
  
  return jresult;
  
}



DllExport void SWIGSTDCALL Ada_LLVMAddTargetData (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMPassManagerRef arg2 = (LLVMPassManagerRef) 0 ;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMPassManagerRef)jarg2; 
  
  LLVMAddTargetData(arg1,arg2);
  
  
}



DllExport char * SWIGSTDCALL Ada_LLVMCopyStringRepOfTargetData (
  void * jarg1
  )
{
  char * jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  char *result = 0 ;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  result = (char *)LLVMCopyStringRepOfTargetData(arg1);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport int SWIGSTDCALL Ada_LLVMByteOrder (
  void * jarg1
  )
{
  int jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMByteOrdering result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  result = (LLVMByteOrdering)LLVMByteOrder(arg1);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned int SWIGSTDCALL Ada_LLVMPointerSize (
  void * jarg1
  )
{
  unsigned int jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  unsigned int result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  result = (unsigned int)LLVMPointerSize(arg1);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport void * SWIGSTDCALL Ada_LLVMIntPtrType (
  void * jarg1
  )
{
  void * jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  result = (LLVMTypeRef)LLVMIntPtrType(arg1);
  jresult = (void *) result;      
  
  
  
  return jresult;
  
}



DllExport unsigned long long SWIGSTDCALL Ada_LLVMSizeOfTypeInBits (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  unsigned long long jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned long long result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  result = (unsigned long long)LLVMSizeOfTypeInBits(arg1,arg2);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned long long SWIGSTDCALL Ada_LLVMStoreSizeOfType (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  unsigned long long jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned long long result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  result = (unsigned long long)LLVMStoreSizeOfType(arg1,arg2);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned long long SWIGSTDCALL Ada_LLVMABISizeOfType (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  unsigned long long jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned long long result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  result = (unsigned long long)LLVMABISizeOfType(arg1,arg2);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned int SWIGSTDCALL Ada_LLVMABIAlignmentOfType (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  unsigned int jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned int result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  result = (unsigned int)LLVMABIAlignmentOfType(arg1,arg2);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned int SWIGSTDCALL Ada_LLVMCallFrameAlignmentOfType (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  unsigned int jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned int result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  result = (unsigned int)LLVMCallFrameAlignmentOfType(arg1,arg2);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned int SWIGSTDCALL Ada_LLVMPreferredAlignmentOfType (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  unsigned int jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned int result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  result = (unsigned int)LLVMPreferredAlignmentOfType(arg1,arg2);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned int SWIGSTDCALL Ada_LLVMPreferredAlignmentOfGlobal (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  unsigned int jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMValueRef arg2 = (LLVMValueRef) 0 ;
  unsigned int result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMValueRef)jarg2; 
  
  result = (unsigned int)LLVMPreferredAlignmentOfGlobal(arg1,arg2);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned int SWIGSTDCALL Ada_LLVMElementAtOffset (
  void * jarg1
  ,
  
  void * jarg2
  ,
  
  unsigned long long jarg3
  )
{
  unsigned int jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned long long arg3 ;
  unsigned int result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  
  arg3 = (unsigned long long) jarg3; 
  
  
  result = (unsigned int)LLVMElementAtOffset(arg1,arg2,arg3);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport unsigned long long SWIGSTDCALL Ada_LLVMOffsetOfElement (
  void * jarg1
  ,
  
  void * jarg2
  ,
  
  unsigned int jarg3
  )
{
  unsigned long long jresult ;
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  unsigned int arg3 ;
  unsigned long long result;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  
  arg3 = (unsigned int) jarg3; 
  
  
  result = (unsigned long long)LLVMOffsetOfElement(arg1,arg2,arg3);
  jresult = result; 
  
  
  
  return jresult;
  
}



DllExport void SWIGSTDCALL Ada_LLVMInvalidateStructLayout (
  void * jarg1
  ,
  
  void * jarg2
  )
{
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  LLVMTypeRef arg2 = (LLVMTypeRef) 0 ;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  arg2 = (LLVMTypeRef)jarg2; 
  
  LLVMInvalidateStructLayout(arg1,arg2);
  
  
}



DllExport void SWIGSTDCALL Ada_LLVMDisposeTargetData (
  void * jarg1
  )
{
  LLVMTargetDataRef arg1 = (LLVMTargetDataRef) 0 ;
  
  arg1 = (LLVMTargetDataRef)jarg1; 
  
  LLVMDisposeTargetData(arg1);
  
  
}



#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif

