Files
Gravity/include/gravity/core.h

65 lines
2.6 KiB
C

#ifndef __GRAVITY__CORE_H
#define __GRAVITY__CORE_H
#include <stdint.h>
#include <stdbool.h>
// === 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