#ifndef __GRAVITY__CORE_H #define __GRAVITY__CORE_H #include #include // === TYPE DEFINITIONS === // typedef struct GravityOpaqueModule* GravityModule; typedef struct GravityOpaqueValue* GravityValue; typedef struct GravityOpaqueBuilder* GravityBuilder; typedef struct GravityOpaqueFunction* GravityFunction; typedef struct GravityOpaqueBlock* GravityBlock; typedef struct GravityOpaqueType* GravityType; typedef enum { GravityIntTypeKind = 0, GravityFloatTypeKind, GravityPointerTypeKind, GravityFunctionTypeKind, } GravityTypeKind; // ========================== // // === FUNCTION DEFINITIONS === // GravityModule gravityCreateModule(void); GravityBuilder gravityCreateBuilder(void); GravityFunction gravityNewFunction(GravityModule module, const char* name, GravityType functionType); GravityBlock gravityStartBlock(const char* name, GravityFunction function, uint16_t numBlockParams, ...); GravityValue newIntConstant(GravityType intType, int64_t value); GravityType gravityCreateFunctionType(int numArgs, GravityType* argTypes, GravityType returnType); GravityType gravityCreateIntegerType(uint8_t width, bool isSigned); char* gravityModuleToCStr(GravityModule module); char* gravityTypeToCStr(GravityType type); char* gravityFunctionToCStr(GravityFunction function); char* gravityValueToCStr(GravityValue value); void gravityPositionBuilderAtEnd(GravityBuilder builder, GravityBlock block); GravityValue gravityNewIntConstant(GravityType intType, int64_t value); // instructions GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name); void gravityBuildStore(GravityBuilder builder, GravityValue pointer, GravityValue value); GravityValue gravityBuildLoad(GravityBuilder builder, GravityValue pointer, const char* name); void gravityBuildRet(GravityBuilder builder, GravityValue returnValue); // ============================ // #endif