#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 GravityOpaqueTargetArch* GravityTargetArch; 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); void gravityCompleteFunction(GravityFunction function); int gravityGetTypeSize(GravityType type); GravityValue gravityBuildIntConstant(GravityBuilder builder, GravityType intType, int64_t value, const char* name); GravityValue gravityNewIntConstant(GravityType intType, int64_t value); GravityType gravityCreateFunctionType(int numArgs, GravityType* argTypes, GravityType returnType); GravityType gravityCreateIntegerType(uint8_t width, bool isSigned); GravityType gravityCreatePointerType(void); char* gravityModuleToCStr(GravityModule module); char* gravityTypeToCStr(GravityType type); char* gravityFunctionToCStr(GravityFunction function); char* gravityValueToCStr(GravityValue value); void gravityBuilderSwitchToBlock(GravityBuilder builder, GravityBlock block); void gravityAppendBlockArgument(GravityBlock block, GravityType type); GravityValue gravityGetBlockArg(GravityBlock block, unsigned int index); // 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); void gravityBuildBr(GravityBuilder builder, GravityValue condition, GravityBlock thenBranch, GravityValue* thenParams, GravityBlock elseBranch, GravityValue* elseParams); void gravityBuildJump(GravityBuilder builder, GravityBlock block, GravityValue* params); // targets char* gravityTargetEmitModule(GravityTargetArch arch, GravityModule module); GravityTargetArch gravityCreate_x86_64Target(void); // ============================ // #endif