packages feed

llvm-data-interop-0.3.0: src/c++/marshal.h

#include <stdint.h>
#include <llvm-base-enums.h>

typedef struct CValue_t CValue;
typedef struct CMeta_t CMeta;
typedef struct CType_t CType;

struct CType_t {
  TypeTag typeTag;
  // For TypeInt, lengths of TypeArray and TypeVector
  unsigned long long size;

  // For TypeFunction
  int isVarArg;

  // For structs
  int isPacked;

  // For TypeFunction, TypeStruct
  CType** typeList;
  int typeListLen;

  // For FunctionType returnType, TypePointer, TypeNamed, and
  // TypeArray and TypeVector
  CType* innerType;

  // Only for TypeNamed
  char *name;

  // For TypePointer
  int addrSpace;

  // For all types
  int sizeInBytes;
};

typedef struct {
  int arrayLen;
  CMeta **arrayElts;
} MetaArrayInfo;

typedef struct {
  char *enumName;
  uint64_t enumValue;
} MetaEnumeratorInfo;

typedef struct {
  CMeta *context;
  char *name;
  char *displayName;
  char *linkageName;
  // CMeta *compileUnit;
  unsigned lineNumber;
  CMeta *globalType;
  int isLocalToUnit;
  int isDefinition;
  CValue *global;
} MetaGlobalInfo;

typedef struct {
  unsigned lineNumber;
  unsigned columnNumber;
  CMeta *scope;
  CMeta *origLocation;
  char *filename;
  char *directory;
} MetaLocationInfo;

typedef struct {
  int64_t lo;
  int64_t hi;
} MetaSubrangeInfo;

typedef struct {
  CMeta *context;
  char *name;
  CMeta *type;
  char *filename;
  char *directory;
  unsigned lineNumber;
  unsigned columnNumber;
} MetaTemplateTypeInfo;

typedef struct {
  CMeta *context;
  char *name;
  CMeta *type;
  uint64_t value;
  char *filename;
  char *directory;
  unsigned lineNumber;
  unsigned columnNumber;
} MetaTemplateValueInfo;

typedef struct {
  CMeta *context;
  char *name;
  // CMeta *compileUnit;
  unsigned lineNumber;
  unsigned argNumber;
  CMeta *type;
  int isArtificial;
  int hasComplexAddress;
  unsigned numAddrElements;
  uint64_t *addrElements;
  int isBlockByRefVar;
} MetaVariableInfo;

typedef struct {
  unsigned language;
  char *filename;
  char *directory;
  char *producer;
  int isMain;
  int isOptimized;
  char *flags;
  unsigned runtimeVersion;
  CMeta *enumTypes;
  CMeta *retainedTypes;
  CMeta *subprograms;
  CMeta *globalVariables;
} MetaCompileUnitInfo;

typedef struct {
  char *filename;
  char *directory;
  // CMeta *compileUnit;
} MetaFileInfo;

typedef struct {
  CMeta *context;
  unsigned lineNumber;
  unsigned columnNumber;
  char *directory;
  char *filename;
} MetaLexicalBlockInfo;

typedef struct {
  CMeta *context;
  char *name;
  char *directory;
  char *filename;
  // CMeta *compileUnit;
  unsigned lineNumber;
} MetaNamespaceInfo;

typedef struct {
  CMeta *context;
  char *name;
  char *displayName;
  char *linkageName;
  // CMeta *compileUnit;
  unsigned lineNumber;
  CMeta *type;
  char *returnTypeName;
  int isLocalToUnit;
  int isDefinition;
  unsigned virtuality;
  unsigned virtualIndex;
  CMeta *containingType;
  int isArtificial;
  int isPrivate;
  int isProtected;
  int isExplicit;
  int isPrototyped;
  int isOptimized;
  char *filename;
  char *directory;
  CValue *function;
  // This is only available in LLVM 3.0+
  // CMeta *templateParams;
} MetaSubprogramInfo;

typedef struct {
  CMeta *context;
  char *name;
  // CMeta *compileUnit;
  // CMeta *file;
  unsigned lineNumber;
  uint64_t sizeInBits;
  uint64_t alignInBits;
  uint64_t offsetInBits;
  unsigned flags;
  int isPrivate;
  int isProtected;
  int isForward;
  int isByRefStruct;
  int isVirtual;
  int isArtificial;
  char *directory;
  char *filename;

  // Basic type
  unsigned encoding;

  // Derived and Composite Types
  CMeta *typeDerivedFrom;
  uint64_t originalTypeSize;

  // Composite Type
  CMeta *typeArray;
  unsigned runTimeLang;
  CMeta *containingType;
  CMeta *templateParams;
} MetaTypeInfo;

typedef struct {
  char *repr;
} MetaUnknownInfo;

struct CMeta_t {
  MetaTag metaTag;
  unsigned int tag;
  union {
    MetaArrayInfo metaArrayInfo;
    MetaEnumeratorInfo metaEnumeratorInfo;
    MetaGlobalInfo metaGlobalInfo;
    MetaLocationInfo metaLocationInfo;
    MetaSubrangeInfo metaSubrangeInfo;
    MetaTemplateTypeInfo metaTemplateTypeInfo;
    MetaTemplateValueInfo metaTemplateValueInfo;
    MetaVariableInfo metaVariableInfo;
    MetaCompileUnitInfo metaCompileUnitInfo;
    MetaFileInfo metaFileInfo;
    MetaLexicalBlockInfo metaLexicalBlockInfo;
    MetaNamespaceInfo metaNamespaceInfo;
    MetaSubprogramInfo metaSubprogramInfo;
    MetaTypeInfo metaTypeInfo;
    MetaUnknownInfo metaUnknownInfo;
  } u;
};

typedef struct {
  int hasSRet;
  int hasByVal;
  int hasNest;
  int hasNoAlias;
  int hasNoCapture;
} CArgumentInfo;

typedef struct {
  CValue **instructions;
  int blockLen;
} CBasicBlockInfo;

typedef struct {
  int isExternal; // Declaration
  int alignment;
  VisibilityStyle visibility;
  LinkageType linkage;
  char *section;

  CallingConvention callingConvention;
  int isVarArg;
  char *gcName;
  CValue **arguments;
  int argListLen;
  CValue **body;
  int blockListLen;
  // FIXME: Add attributes
} CFunctionInfo;

typedef struct {
  int isExternal; // Declaration
  int alignment;
  VisibilityStyle visibility;
  LinkageType linkage;
  char *section;

  // Only for global vars
  CValue *initializer;
  int isThreadLocal;
  int isConstant;

  // Only for global aliases
  CValue *aliasee;
} CGlobalInfo;

typedef struct {
  CValue **operands;
  int numOperands;

  // Value insts
  int *indices;
  int numIndices;

  // Comparisons
  CmpPredicate cmpPred;

  // Binary operators
  ArithFlags flags;

  // Misc
  int align;
  int addrSpace;

  // Load/Store
  int isVolatile;

  // GEP
  int inBounds;
} CInstructionInfo;

typedef struct {
  CAtomicOrdering ordering;
  CSynchronizationScope scope;
  AtomicOperation operation;
  int isVolatile;
  int addrSpace;

  // cmpxchg, atomicrwm
  CValue *pointerOperand;
  // cmpxchg, atomicrwm
  CValue *valueOperand;
  // cmpxchg
  CValue *compareOperand;
} CAtomicInfo;

typedef struct {
  CValue **incomingValues;
  CValue **valueBlocks;
  int numIncomingValues;
} CPHIInfo;

typedef struct {
  CValue *personality;
  int isCleanup;
  int numClauses;
  CValue **clauses;
  LandingPadClause *clauseTypes;
} CLandingPadInfo;

// Also for invoke
typedef struct {
  CValue *calledValue;
  CValue **arguments;
  int argListLen;
  CallingConvention callingConvention;
  int hasSRet;
  int isTail;

  // FIXME: Add attributes

  // Invoke only
  CValue *normalDest;
  CValue *unwindDest;
} CCallInfo;

typedef struct {
  char *asmString;
  char *constraintString;
} CInlineAsmInfo;

typedef struct {
  CValue *func;
  CValue *block;
} CBlockAddrInfo;

// This is lossy but good enough for all practical purposes.
typedef struct {
  long long int val;
  char* hugeVal;
} CConstInt;

typedef struct {
  double val;
} CConstFP;

typedef struct {
  CValue **constants;
  int numElements;
} CConstAggregate;

typedef struct {
  CInstructionInfo *ii;
  ValueTag instrType;
} CConstExprInfo;

struct CValue_t {
  ValueTag valueTag;
  CType *valueType;
  char *name;
  CMeta **md;
  CMeta *srcLoc;
  int numMetadata;
  int metaCapacity;

  void *data;
};

typedef struct {
  char *moduleIdentifier;
  char *moduleDataLayout;
  char *targetTriple;
  int littleEndian;
  int pointerSize;
  char *moduleInlineAsm;

  CValue **globalVariables;
  int numGlobalVariables;
  CValue **globalAliases;
  int numGlobalAliases;
  CValue **functions;
  int numFunctions;

  CType **types;
  int numTypes;

  CMeta **enumMetadata;
  int numEnumMetadata;

  CMeta **retainedTypeMetadata;
  int numRetainedTypes;

  int hasError;
  char *errMsg;

  void *privateData;
} CModule;

#if defined(_WIN32) || defined(__CYGWIN__)
  #if defined(__GNUC__)
    #define DLL_PUBLIC __attribute__((dllexport))
  #else
    #define DLL_PUBLIC __declspec(dllexport)
  #endif
#else
  #if __GNUC__ >= 4
    #define DLL_PUBLIC __attribute__((visibility("default")))
  #endif
#endif

#if defined(__cplusplus)
extern "C" {
#endif
  DLL_PUBLIC void disposeCModule(CModule *m);
  DLL_PUBLIC CModule* marshalLLVM(const char *buffer, int bufLen, int includeLocs);
  DLL_PUBLIC CModule* marshalLLVMFile(const char *filename, int includeLocs);
#if defined(__cplusplus)
}
#endif