From bc99bacb2122f073133ddf6eeb31b4db56a99fa7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 13 Dec 2023 12:38:01 +0000 Subject: [PATCH] Update Tilde --- src/tilde.cpp | 4 +- src/tilde.hpp | 4 +- src/tilde/tb.h | 370 +++++++++++++++++++++++++++----------------- src/tilde/tb.lib | Bin 4265424 -> 2347218 bytes src/tilde/tb_coff.h | 6 +- src/tilde/tb_x64.h | 31 +++- src/tilde_const.cpp | 2 +- src/tilde_expr.cpp | 2 +- src/tilde_proc.cpp | 9 +- src/tilde_stmt.cpp | 4 +- 10 files changed, 269 insertions(+), 163 deletions(-) diff --git a/src/tilde.cpp b/src/tilde.cpp index b27c42a12..8e3e25836 100644 --- a/src/tilde.cpp +++ b/src/tilde.cpp @@ -215,7 +215,7 @@ gb_internal void cg_set_debug_pos_from_node(cgProcedure *p, Ast *node) { TokenPos pos = ast_token(node).pos; TB_SourceFile **file = map_get(&p->module->file_id_map, cast(uintptr)pos.file_id); if (file) { - tb_inst_set_location(p->func, *file, pos.line, pos.column); + tb_inst_location(p->func, *file, pos.line, pos.column); } } } @@ -373,7 +373,7 @@ gb_internal bool cg_global_variables_create(cgModule *m, Array TB_Global *global = tb_global_create(m->mod, name.len, cast(char const *)name.text, debug_type, linkage); cgValue g = cg_value(global, alloc_type_pointer(e->type)); - TB_ModuleSection *section = tb_module_get_data(m->mod); + TB_ModuleSectionHandle section = tb_module_get_data(m->mod); if (e->Variable.thread_local_model != "") { section = tb_module_get_tls(m->mod); diff --git a/src/tilde.hpp b/src/tilde.hpp index 7088912fd..d141b2330 100644 --- a/src/tilde.hpp +++ b/src/tilde.hpp @@ -8,8 +8,8 @@ #include "tilde/tb.h" #include "tilde/tb_arena.h" -#define TB_TYPE_F16 TB_DataType{ { TB_INT, 0, 16 } } -#define TB_TYPE_I128 TB_DataType{ { TB_INT, 0, 128 } } +#define TB_TYPE_F16 TB_DataType{ { TB_INT, 16 } } +#define TB_TYPE_I128 TB_DataType{ { TB_INT, 128 } } #define TB_TYPE_INT TB_TYPE_INTN(cast(u16)(8*build_context.int_size)) #define TB_TYPE_INTPTR TB_TYPE_INTN(cast(u16)(8*build_context.ptr_size)) diff --git a/src/tilde/tb.h b/src/tilde/tb.h index 5bb98fe70..4fe21c902 100644 --- a/src/tilde/tb.h +++ b/src/tilde/tb.h @@ -4,9 +4,15 @@ // SSA - single static assignment // GVN - global value numbering // CSE - common subexpression elimination +// CFG - control flow graph // DSE - dead store elimination // GCM - global code motion // SROA - scalar replacement of aggregates +// SCCP - sparse conditional constant propagation +// RPO - reverse postorder +// BB - basic block +// ZTC - zero trip count +// SCC - strongly connected components #ifndef TB_CORE_H #define TB_CORE_H @@ -21,7 +27,7 @@ // https://semver.org/ #define TB_VERSION_MAJOR 0 -#define TB_VERSION_MINOR 2 +#define TB_VERSION_MINOR 3 #define TB_VERSION_PATCH 0 #ifndef TB_API @@ -125,12 +131,6 @@ typedef struct TB_FeatureSet { TB_FeatureSet_X64 x64; } TB_FeatureSet; -typedef enum TB_BranchHint { - TB_BRANCH_HINT_NONE, - TB_BRANCH_HINT_LIKELY, - TB_BRANCH_HINT_UNLIKELY -} TB_BranchHint; - typedef enum TB_Linkage { TB_LINKAGE_PUBLIC, TB_LINKAGE_PRIVATE @@ -151,12 +151,6 @@ typedef enum TB_MemoryOrder { TB_MEM_ORDER_SEQ_CST, } TB_MemoryOrder; -typedef enum TB_ISelMode { - // FastISel - TB_ISEL_FAST, - TB_ISEL_COMPLEX -} TB_ISelMode; - typedef enum TB_DataTypeEnum { // Integers, note void is an i0 and bool is an i1 // i(0-64) @@ -166,12 +160,14 @@ typedef enum TB_DataTypeEnum { TB_FLOAT, // Pointers TB_PTR, - // Tuples, these cannot be used in memory ops, just accessed via projections - TB_TUPLE, // represents control flow for REGION, BRANCH TB_CONTROL, // represents memory (and I/O) TB_MEMORY, + // continuation (usually just return addresses :p) + TB_CONT, + // Tuples, these cannot be used in memory ops, just accessed via projections + TB_TUPLE, } TB_DataTypeEnum; typedef enum TB_FloatFormat { @@ -181,15 +177,13 @@ typedef enum TB_FloatFormat { typedef union TB_DataType { struct { - uint8_t type; - // Only integers and floats can be wide. - uint8_t width; + uint16_t type : 4; // for integers it's the bitwidth - uint16_t data; + uint16_t data : 12; }; - uint32_t raw; + uint16_t raw; } TB_DataType; -static_assert(sizeof(TB_DataType) == 4, "im expecting this to be a uint32_t"); +static_assert(sizeof(TB_DataType) == 2, "im expecting this to be a uint16_t"); // classify data types #define TB_IS_VOID_TYPE(x) ((x).type == TB_INT && (x).data == 0) @@ -240,6 +234,11 @@ typedef enum TB_NodeTypeEnum { TB_MACHINE_OP, // (Control, Memory) & Buffer -> (Control, Memory) // reads the TSC on x64 TB_CYCLE_COUNTER, // (Control) -> Int64 + // prefetches data for reading. The number next to the + // + // 0 is temporal + // 1-3 are just cache levels + TB_PREFETCH, // (Memory, Ptr) & Int -> Memory //////////////////////////////// // CONTROL @@ -269,7 +268,11 @@ typedef enum TB_NodeTypeEnum { // trap will not be continuable but will stop execution. TB_TRAP, // (Control) -> (Control) // unreachable means it won't trap or be continuable. - TB_UNREACHABLE, // (Control) -> (Control) + TB_UNREACHABLE, // (Control) -> () + // this is generated when a path becomes disconnected + // from the main IR, it'll be reduced by the monotonic + // rewrites. + TB_DEAD, // () -> (Control) //////////////////////////////// // CONTROL + MEMORY @@ -278,38 +281,49 @@ typedef enum TB_NodeTypeEnum { // target pointer (or syscall number) and the rest are just data args. TB_CALL, // (Control, Memory, Data, Data...) -> (Control, Memory, Data) TB_SYSCALL, // (Control, Memory, Data, Data...) -> (Control, Memory, Data) + // performs call while recycling the stack frame somewhat + TB_TAILCALL, // (Control, Memory, RPC, Data, Data...) -> () // safepoint polls are the same except they only trigger if the poll site // says to (platform specific but almost always just the page being made // unmapped/guard), 3rd argument is the poll site. - TB_SAFEPOINT_POLL, // (Control, Memory, Ptr, Data...) -> (Control) + TB_SAFEPOINT_POLL, // (Control, Memory, Ptr?, Data...) -> (Control) + // this safepoint which doesn't emit any poll site, it's just + // an address, this is used by AOT compiles to encode line info. + TB_SAFEPOINT_NOP, // (Control, Memory, Ptr?, Data...) -> (Control) //////////////////////////////// // MEMORY //////////////////////////////// + // MERGEMEM will join multiple non-aliasing memory effects, because + // they don't alias there's no ordering guarentee. + TB_MERGEMEM, // (Memory...) -> Memory // LOAD and STORE are standard memory accesses, they can be folded away. - TB_LOAD, // (Memory, Ptr) -> Data - TB_STORE, // (Memory, Ptr, Data) -> Memory + TB_LOAD, // (Control?, Memory, Ptr) -> Data + TB_STORE, // (Control, Memory, Ptr, Data) -> Memory // bulk memory ops. - TB_MEMCPY, // (Memory, Ptr, Ptr, Size) -> Memory - TB_MEMSET, // (Memory, Ptr, Int8, Size) -> Memory + TB_MEMCPY, // (Control, Memory, Ptr, Ptr, Size) -> Memory + TB_MEMSET, // (Control, Memory, Ptr, Int8, Size) -> Memory // these memory accesses represent "volatile" which means // they may produce side effects and thus cannot be eliminated. - TB_READ, // (Memory, Ptr) -> (Memory, Data) - TB_WRITE, // (Memory, Ptr, Data) -> (Memory, Data) + TB_READ, // (Control, Memory, Ptr) -> (Memory, Data) + TB_WRITE, // (Control, Memory, Ptr, Data) -> (Memory, Data) // atomics have multiple observers (if not they wouldn't need to // be atomic) and thus produce side effects everywhere just like // volatiles except they have synchronization guarentees. the atomic // data ops will return the value before the operation is performed. // Atomic CAS return the old value and a boolean for success (true if // the value was changed) - TB_ATOMIC_LOAD, // (Memory, Ptr) -> (Memory, Data) - TB_ATOMIC_XCHG, // (Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_ADD, // (Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_SUB, // (Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_AND, // (Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_XOR, // (Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_OR, // (Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_CAS, // (Memory, Data, Data) -> (Memory, Data, Bool) + TB_ATOMIC_LOAD, // (Control, Memory, Ptr) -> (Memory, Data) + TB_ATOMIC_XCHG, // (Control, Memory, Ptr, Data) -> (Memory, Data) + TB_ATOMIC_ADD, // (Control, Memory, Ptr, Data) -> (Memory, Data) + TB_ATOMIC_SUB, // (Control, Memory, Ptr, Data) -> (Memory, Data) + TB_ATOMIC_AND, // (Control, Memory, Ptr, Data) -> (Memory, Data) + TB_ATOMIC_XOR, // (Control, Memory, Ptr, Data) -> (Memory, Data) + TB_ATOMIC_OR, // (Control, Memory, Ptr, Data) -> (Memory, Data) + TB_ATOMIC_CAS, // (Control, Memory, Data, Data) -> (Memory, Data, Bool) + + // like a multi-way branch but without the control flow aspect, but for data. + TB_LOOKUP, //////////////////////////////// // POINTERS @@ -375,6 +389,8 @@ typedef enum TB_NodeTypeEnum { TB_FSUB, TB_FMUL, TB_FDIV, + TB_FMAX, + TB_FMIN, // Comparisons TB_CMP_EQ, @@ -418,10 +434,17 @@ typedef uint32_t TB_CharUnits; typedef struct { // used by the debug info export int id; + size_t len; uint8_t path[]; } TB_SourceFile; +typedef struct TB_Location { + TB_SourceFile* file; + int line, column; + uint32_t pos; +} TB_Location; + // SO refers to shared objects which mean either shared libraries (.so or .dll) // or executables (.exe or ELF executables) typedef enum { @@ -441,31 +464,38 @@ typedef struct TB_DebugType TB_DebugType; typedef struct TB_ModuleSection TB_ModuleSection; typedef struct TB_FunctionPrototype TB_FunctionPrototype; -typedef struct TB_Attrib TB_Attrib; +enum { TB_MODULE_SECTION_NONE = -1 }; +typedef int32_t TB_ModuleSectionHandle; +typedef struct TB_Attrib TB_Attrib; // target-specific, just a unique ID for the registers typedef int TB_PhysicalReg; +// Thread local module state +typedef struct TB_ThreadInfo TB_ThreadInfo; + +typedef enum { + TB_SYMBOL_NONE, + TB_SYMBOL_EXTERNAL, + TB_SYMBOL_GLOBAL, + TB_SYMBOL_FUNCTION, + TB_SYMBOL_MAX, +} TB_SymbolTag; + // Refers generically to objects within a module // // TB_Function, TB_Global, and TB_External are all subtypes of TB_Symbol // and thus are safely allowed to cast into a symbol for operations. typedef struct TB_Symbol { - enum TB_SymbolTag { - TB_SYMBOL_NONE, + #ifdef __cplusplus + TB_SymbolTag tag; + #else + _Atomic TB_SymbolTag tag; + #endif - // symbol is dead now - TB_SYMBOL_TOMBSTONE, - - TB_SYMBOL_EXTERNAL, - TB_SYMBOL_GLOBAL, - TB_SYMBOL_FUNCTION, - - TB_SYMBOL_MAX, - } tag; - - // refers to the prev or next symbol with the same tag - struct TB_Symbol* next; + // which thread info it's tied to (we may need to remove it, this + // is used for that) + TB_ThreadInfo* info; char* name; // It's kinda a weird circular reference but yea @@ -484,15 +514,28 @@ typedef struct TB_Symbol { } TB_Symbol; typedef struct TB_Node TB_Node; +typedef struct User User; +struct User { + User* next; + TB_Node* n; + int slot; +}; + struct TB_Node { TB_NodeType type; - uint16_t input_count; // number of node inputs. + uint16_t input_count; TB_DataType dt; // makes it easier to track in graph walks - size_t gvn; + uint32_t gvn; - TB_Attrib* attribs; + // only value while inside of a TB_Passes, + // these are unordered and usually just + // help perform certain transformations or + // analysis (not necessarily semantics) + User* users; + + // ordered def-use edges, jolly ol' semantics TB_Node** inputs; char extra[]; @@ -506,8 +549,6 @@ struct TB_Node { // this represents switch (many targets), if (one target) and goto (only default) logic. typedef struct { // TB_BRANCH size_t succ_count; - TB_Node** succ; - int64_t keys[]; } TB_NodeBranch; @@ -527,16 +568,17 @@ typedef struct { // any integer binary operator TB_ArithmeticBehavior ab; } TB_NodeBinopInt; -typedef struct { // TB_MULPAIR - TB_Node *lo, *hi; -} TB_NodeArithPair; - typedef struct { TB_CharUnits align; } TB_NodeMemAccess; +typedef struct { + int level; +} TB_NodePrefetch; + typedef struct { TB_CharUnits size, align; + int alias_index; // 0 if local is used beyond direct memops, 1...n as a unique alias name } TB_NodeLocal; typedef struct { @@ -576,33 +618,42 @@ typedef struct { TB_Node* proj1; } TB_NodeAtomic; +typedef struct { + // line info on safepoints + TB_SourceFile* file; + int line, column; +} TB_NodeSafepoint; + typedef struct { TB_FunctionPrototype* proto; + int proj_count; TB_Node* projs[]; } TB_NodeCall; typedef struct { - uint32_t id; -} TB_NodeSafepoint; + TB_FunctionPrototype* proto; +} TB_NodeTailcall; typedef struct { - TB_Node* end; const char* tag; - // position in a postorder walk - int postorder_id; - // immediate dominator (can be approximate) - int dom_depth; - TB_Node* dom; + // magic factor for hot-code, higher means run more often + float freq; // used for IR building only, stale after that. - // - // this represents the first and last memory values within a region, - // if a region ever has multiple predecessors we apply a join on these - // memory. TB_Node *mem_in, *mem_out; } TB_NodeRegion; +typedef struct { + int64_t key; + uint64_t val; +} TB_LookupEntry; + +typedef struct { + size_t entry_count; + TB_LookupEntry entries[]; +} TB_NodeLookup; + typedef struct TB_MultiOutput { size_t count; union { @@ -634,6 +685,12 @@ typedef struct { int32_t values[]; } TB_Safepoint; +typedef enum { + TB_MODULE_SECTION_WRITE = 1, + TB_MODULE_SECTION_EXEC = 2, + TB_MODULE_SECTION_TLS = 4, +} TB_ModuleSectionFlags; + // ******************************* // Public macros // ******************************* @@ -641,35 +698,37 @@ typedef struct { #define TB_TYPE_TUPLE TB_DataType{ { TB_TUPLE } } #define TB_TYPE_CONTROL TB_DataType{ { TB_CONTROL } } -#define TB_TYPE_VOID TB_DataType{ { TB_INT, 0, 0 } } -#define TB_TYPE_I8 TB_DataType{ { TB_INT, 0, 8 } } -#define TB_TYPE_I16 TB_DataType{ { TB_INT, 0, 16 } } -#define TB_TYPE_I32 TB_DataType{ { TB_INT, 0, 32 } } -#define TB_TYPE_I64 TB_DataType{ { TB_INT, 0, 64 } } -#define TB_TYPE_F32 TB_DataType{ { TB_FLOAT, 0, TB_FLT_32 } } -#define TB_TYPE_F64 TB_DataType{ { TB_FLOAT, 0, TB_FLT_64 } } -#define TB_TYPE_BOOL TB_DataType{ { TB_INT, 0, 1 } } -#define TB_TYPE_PTR TB_DataType{ { TB_PTR, 0, 0 } } -#define TB_TYPE_MEMORY TB_DataType{ { TB_MEMORY,0, 0 } } -#define TB_TYPE_INTN(N) TB_DataType{ { TB_INT, 0, (N) } } -#define TB_TYPE_PTRN(N) TB_DataType{ { TB_PTR, 0, (N) } } +#define TB_TYPE_VOID TB_DataType{ { TB_INT, 0 } } +#define TB_TYPE_I8 TB_DataType{ { TB_INT, 8 } } +#define TB_TYPE_I16 TB_DataType{ { TB_INT, 16 } } +#define TB_TYPE_I32 TB_DataType{ { TB_INT, 32 } } +#define TB_TYPE_I64 TB_DataType{ { TB_INT, 64 } } +#define TB_TYPE_F32 TB_DataType{ { TB_FLOAT, TB_FLT_32 } } +#define TB_TYPE_F64 TB_DataType{ { TB_FLOAT, TB_FLT_64 } } +#define TB_TYPE_BOOL TB_DataType{ { TB_INT, 1 } } +#define TB_TYPE_PTR TB_DataType{ { TB_PTR, 0 } } +#define TB_TYPE_MEMORY TB_DataType{ { TB_MEMORY,0 } } +#define TB_TYPE_CONT TB_DataType{ { TB_CONT, 0 } } +#define TB_TYPE_INTN(N) TB_DataType{ { TB_INT, (N) } } +#define TB_TYPE_PTRN(N) TB_DataType{ { TB_PTR, (N) } } #else #define TB_TYPE_TUPLE (TB_DataType){ { TB_TUPLE } } #define TB_TYPE_CONTROL (TB_DataType){ { TB_CONTROL } } -#define TB_TYPE_VOID (TB_DataType){ { TB_INT, 0, 0 } } -#define TB_TYPE_I8 (TB_DataType){ { TB_INT, 0, 8 } } -#define TB_TYPE_I16 (TB_DataType){ { TB_INT, 0, 16 } } -#define TB_TYPE_I32 (TB_DataType){ { TB_INT, 0, 32 } } -#define TB_TYPE_I64 (TB_DataType){ { TB_INT, 0, 64 } } -#define TB_TYPE_F32 (TB_DataType){ { TB_FLOAT, 0, TB_FLT_32 } } -#define TB_TYPE_F64 (TB_DataType){ { TB_FLOAT, 0, TB_FLT_64 } } -#define TB_TYPE_BOOL (TB_DataType){ { TB_INT, 0, 1 } } -#define TB_TYPE_PTR (TB_DataType){ { TB_PTR, 0, 0 } } -#define TB_TYPE_MEMORY (TB_DataType){ { TB_MEMORY,0, 0 } } -#define TB_TYPE_INTN(N) (TB_DataType){ { TB_INT, 0, (N) } } -#define TB_TYPE_PTRN(N) (TB_DataType){ { TB_PTR, 0, (N) } } +#define TB_TYPE_VOID (TB_DataType){ { TB_INT, 0 } } +#define TB_TYPE_I8 (TB_DataType){ { TB_INT, 8 } } +#define TB_TYPE_I16 (TB_DataType){ { TB_INT, 16 } } +#define TB_TYPE_I32 (TB_DataType){ { TB_INT, 32 } } +#define TB_TYPE_I64 (TB_DataType){ { TB_INT, 64 } } +#define TB_TYPE_F32 (TB_DataType){ { TB_FLOAT, TB_FLT_32 } } +#define TB_TYPE_F64 (TB_DataType){ { TB_FLOAT, TB_FLT_64 } } +#define TB_TYPE_BOOL (TB_DataType){ { TB_INT, 1 } } +#define TB_TYPE_PTR (TB_DataType){ { TB_PTR, 0 } } +#define TB_TYPE_CONT (TB_DataType){ { TB_CONT, 0 } } +#define TB_TYPE_MEMORY (TB_DataType){ { TB_MEMORY,0 } } +#define TB_TYPE_INTN(N) (TB_DataType){ { TB_INT, (N) } } +#define TB_TYPE_PTRN(N) (TB_DataType){ { TB_PTR, (N) } } #endif @@ -681,7 +740,8 @@ typedef struct TB_Arena TB_Arena; // 0 for default TB_API void tb_arena_create(TB_Arena* restrict arena, size_t chunk_size); TB_API void tb_arena_destroy(TB_Arena* restrict arena); -TB_API bool tb_arena_is_empty(TB_Arena* arena); +TB_API bool tb_arena_is_empty(TB_Arena* restrict arena); +TB_API void tb_arena_clear(TB_Arena* restrict arena); //////////////////////////////// // Module management @@ -692,8 +752,6 @@ TB_API TB_Module* tb_module_create(TB_Arch arch, TB_System sys, const TB_Feature // Creates a module but defaults on the architecture and system based on the host machine TB_API TB_Module* tb_module_create_for_host(const TB_FeatureSet* features, bool is_jit); -TB_API size_t tb_module_get_function_count(TB_Module* m); - // Frees all resources for the TB_Module and it's functions, globals and // compiled code. TB_API void tb_module_destroy(TB_Module* m); @@ -703,9 +761,16 @@ TB_API void tb_module_destroy(TB_Module* m); // dont and the tls_index is used, it'll crash TB_API void tb_module_set_tls_index(TB_Module* m, ptrdiff_t len, const char* name); -// You don't need to manually call this unless you want to resolve locations before -// exporting. -TB_API void tb_module_layout_sections(TB_Module* m); +TB_API TB_ModuleSectionHandle tb_module_create_section(TB_Module* m, ptrdiff_t len, const char* name, TB_ModuleSectionFlags flags, TB_ComdatType comdat); + +typedef struct { + TB_ThreadInfo* info; + size_t i; +} TB_SymbolIter; + +// Lovely iterator for all the symbols... it's probably not "fast" +TB_SymbolIter tb_symbol_iter(TB_Module* mod); +TB_Symbol* tb_symbol_iter_next(TB_SymbolIter* iter); //////////////////////////////// // Compiled code introspection @@ -728,6 +793,9 @@ TB_API void tb_output_print_asm(TB_FunctionOutput* out, FILE* fp); TB_API uint8_t* tb_output_get_code(TB_FunctionOutput* out, size_t* out_length); +// returns NULL if there's no line info +TB_API TB_Location* tb_output_get_locations(TB_FunctionOutput* out, size_t* out_count); + // returns NULL if no assembly was generated TB_API TB_Assembly* tb_output_get_asm(TB_FunctionOutput* out); @@ -738,17 +806,55 @@ TB_API TB_Safepoint* tb_safepoint_get(TB_Function* f, uint32_t relative_ip); // JIT compilation //////////////////////////////// typedef struct TB_JIT TB_JIT; +typedef struct TB_CPUContext TB_CPUContext; // passing 0 to jit_heap_capacity will default to 4MiB TB_API TB_JIT* tb_jit_begin(TB_Module* m, size_t jit_heap_capacity); TB_API void* tb_jit_place_function(TB_JIT* jit, TB_Function* f); TB_API void* tb_jit_place_global(TB_JIT* jit, TB_Global* g); +TB_API void tb_jit_dump_heap(TB_JIT* jit); TB_API void tb_jit_end(TB_JIT* jit); +typedef struct { + TB_Symbol* base; + uint32_t offset; +} TB_ResolvedAddr; + +typedef struct { + TB_Function* f; + TB_Location* loc; + uint32_t start, end; +} TB_ResolvedLine; + +TB_API TB_ResolvedAddr tb_jit_addr2sym(TB_JIT* jit, void* ptr); +TB_API TB_ResolvedLine tb_jit_addr2line(TB_JIT* jit, void* ptr); TB_API void* tb_jit_get_code_ptr(TB_Function* f); -// Generates a 2MiB stack -TB_API void* tb_jit_stack_create(size_t* out_size); +typedef enum { + // just keeps running + TB_DBG_NONE, + // stops after one instruction + TB_DBG_INST, + // stops once the line changes + TB_DBG_LINE, +} TB_DbgStep; + +// Debugger stuff +// creates a new context we can run JIT code in, you don't +// technically need this but it's a nice helper for writing +// JITs especially when it comes to breakpoints (and eventually +// safepoints) +TB_API TB_CPUContext* tb_jit_thread_create(void* entry, void* arg); +// runs until TB_DbgStep condition is met +TB_API bool tb_jit_thread_resume(TB_JIT* jit, TB_CPUContext* cpu, TB_DbgStep step); +TB_API void* tb_jit_thread_pc(TB_CPUContext* cpu); +TB_API void tb_jit_breakpoint(TB_JIT* jit, void* addr); +TB_API void tb_jit_thread_dump_stack(TB_JIT* jit, TB_CPUContext* cpu); + +//////////////////////////////// +// Disassembler +//////////////////////////////// +TB_API ptrdiff_t tb_print_disassembly_inst(TB_Arch arch, size_t length, const void* ptr); //////////////////////////////// // Exporter @@ -820,18 +926,7 @@ TB_API void tb_linker_append_library(TB_Linker* l, TB_Slice ar_name, TB_Slice co //////////////////////////////// // Symbols //////////////////////////////// -#define TB_FOR_FUNCTIONS(it, module) for (TB_Function* it = tb_first_function(module); it != NULL; it = tb_next_function(it)) -TB_API TB_Function* tb_first_function(TB_Module* m); -TB_API TB_Function* tb_next_function(TB_Function* f); - -#define TB_FOR_EXTERNALS(it, module) for (TB_External* it = tb_first_external(module); it != NULL; it = tb_next_external(it)) -TB_API TB_External* tb_first_external(TB_Module* m); -TB_API TB_External* tb_next_external(TB_External* e); - -// this is used JIT scenarios to tell the compiler what externals map to -TB_API TB_ExternalType tb_extern_get_type(TB_External* e); TB_API TB_Global* tb_extern_transmute(TB_External* e, TB_DebugType* dbg_type, TB_Linkage linkage); - TB_API TB_External* tb_extern_create(TB_Module* m, ptrdiff_t len, const char* name, TB_ExternalType type); TB_API TB_SourceFile* tb_get_source_file(TB_Module* m, const char* path); @@ -876,7 +971,7 @@ TB_API TB_FunctionPrototype* tb_prototype_create(TB_Module* m, TB_CallingConv cc // into the correct ABI and exposing sane looking nodes to the parameters. // // returns the parameters -TB_API TB_Node** tb_function_set_prototype_from_dbg(TB_Function* f, TB_DebugType* dbg, TB_Arena* arena, size_t* out_param_count); +TB_API TB_Node** tb_function_set_prototype_from_dbg(TB_Function* f, TB_ModuleSectionHandle section, TB_DebugType* dbg, TB_Arena* arena, size_t* out_param_count); TB_API TB_FunctionPrototype* tb_prototype_from_dbg(TB_Module* m, TB_DebugType* dbg); // used for ABI parameter passing @@ -899,7 +994,7 @@ TB_API TB_PassingRule tb_get_passing_rule_from_dbg(TB_Module* mod, TB_DebugType* TB_API TB_Global* tb_global_create(TB_Module* m, ptrdiff_t len, const char* name, TB_DebugType* dbg_type, TB_Linkage linkage); // allocate space for the global -TB_API void tb_global_set_storage(TB_Module* m, TB_ModuleSection* section, TB_Global* global, size_t size, size_t align, size_t max_objects); +TB_API void tb_global_set_storage(TB_Module* m, TB_ModuleSectionHandle section, TB_Global* global, size_t size, size_t align, size_t max_objects); // returns a buffer which the user can fill to then have represented in the initializer TB_API void* tb_global_add_region(TB_Module* m, TB_Global* global, size_t offset, size_t size); @@ -908,10 +1003,10 @@ TB_API void* tb_global_add_region(TB_Module* m, TB_Global* global, size_t offset // depends on the pointer size TB_API void tb_global_add_symbol_reloc(TB_Module* m, TB_Global* global, size_t offset, const TB_Symbol* symbol); -TB_API TB_ModuleSection* tb_module_get_text(TB_Module* m); -TB_API TB_ModuleSection* tb_module_get_rdata(TB_Module* m); -TB_API TB_ModuleSection* tb_module_get_data(TB_Module* m); -TB_API TB_ModuleSection* tb_module_get_tls(TB_Module* m); +TB_API TB_ModuleSectionHandle tb_module_get_text(TB_Module* m); +TB_API TB_ModuleSectionHandle tb_module_get_rdata(TB_Module* m); +TB_API TB_ModuleSectionHandle tb_module_get_data(TB_Module* m); +TB_API TB_ModuleSectionHandle tb_module_get_tls(TB_Module* m); //////////////////////////////// // Function Attributes @@ -919,7 +1014,6 @@ TB_API TB_ModuleSection* tb_module_get_tls(TB_Module* m); // These are parts of a function that describe metadata for instructions TB_API void tb_function_attrib_variable(TB_Function* f, TB_Node* n, TB_Node* parent, ptrdiff_t len, const char* name, TB_DebugType* type); TB_API void tb_function_attrib_scope(TB_Function* f, TB_Node* n, TB_Node* parent); -TB_API void tb_function_attrib_location(TB_Function* f, TB_Node* n, TB_SourceFile* file, int line, int column); //////////////////////////////// // Debug info Generation @@ -950,17 +1044,9 @@ TB_API size_t tb_debug_func_param_count(TB_DebugType* type); TB_API TB_DebugType** tb_debug_func_params(TB_DebugType* type); TB_API TB_DebugType** tb_debug_func_returns(TB_DebugType* type); -//////////////////////////////// -// IR access -//////////////////////////////// -// it is an index to the input -#define TB_FOR_INPUT_IN_NODE(it, parent) for (TB_Node **it = parent->inputs, **__end = it + (parent)->input_count; it != __end; it++) - //////////////////////////////// // Symbols //////////////////////////////// -TB_API bool tb_symbol_is_comdat(const TB_Symbol* s); - // returns NULL if the tag doesn't match TB_API TB_Function* tb_symbol_as_function(TB_Symbol* s); TB_API TB_External* tb_symbol_as_external(TB_Symbol* s); @@ -974,16 +1060,13 @@ TB_API void tb_get_data_type_size(TB_Module* mod, TB_DataType dt, size_t* size, // the user_data is expected to be a valid FILE* TB_API void tb_default_print_callback(void* user_data, const char* fmt, ...); -TB_API void tb_inst_set_location(TB_Function* f, TB_SourceFile* file, int line, int column); -TB_API void tb_inst_reset_location(TB_Function* f); +TB_API void tb_inst_location(TB_Function* f, TB_SourceFile* file, int line, int column); // this is where the STOP will be TB_API void tb_inst_set_exit_location(TB_Function* f, TB_SourceFile* file, int line, int column); -TB_API bool tb_has_effects(TB_Node* n); - // if section is NULL, default to .text -TB_API TB_Function* tb_function_create(TB_Module* m, ptrdiff_t len, const char* name, TB_Linkage linkage, TB_ComdatType comdat); +TB_API TB_Function* tb_function_create(TB_Module* m, ptrdiff_t len, const char* name, TB_Linkage linkage); TB_API TB_Arena* tb_function_get_arena(TB_Function* f); @@ -994,11 +1077,9 @@ TB_API void tb_symbol_bind_ptr(TB_Symbol* s, void* ptr); TB_API const char* tb_symbol_get_name(TB_Symbol* s); // if arena is NULL, defaults to module arena which is freed on tb_free_thread_resources -TB_API void tb_function_set_prototype(TB_Function* f, TB_FunctionPrototype* p, TB_Arena* arena); +TB_API void tb_function_set_prototype(TB_Function* f, TB_ModuleSectionHandle section, TB_FunctionPrototype* p, TB_Arena* arena); TB_API TB_FunctionPrototype* tb_function_get_prototype(TB_Function* f); -TB_API void tb_function_print(TB_Function* f, TB_PrintCallback callback, void* user_data); - TB_API void tb_inst_set_control(TB_Function* f, TB_Node* control); TB_API TB_Node* tb_inst_get_control(TB_Function* f); @@ -1010,7 +1091,7 @@ TB_API void tb_inst_set_region_name(TB_Function* f, TB_Node* n, ptrdiff_t len, c TB_API void tb_inst_unreachable(TB_Function* f); TB_API void tb_inst_debugbreak(TB_Function* f); TB_API void tb_inst_trap(TB_Function* f); -TB_API TB_Node* tb_inst_poison(TB_Function* f); +TB_API TB_Node* tb_inst_poison(TB_Function* f, TB_DataType dt); TB_API TB_Node* tb_inst_param(TB_Function* f, int param_id); @@ -1135,6 +1216,7 @@ TB_API TB_Node* tb_inst_cmp_fge(TB_Function* f, TB_Node* a, TB_Node* b); // General intrinsics TB_API TB_Node* tb_inst_va_start(TB_Function* f, TB_Node* a); TB_API TB_Node* tb_inst_cycle_counter(TB_Function* f); +TB_API TB_Node* tb_inst_prefetch(TB_Function* f, TB_Node* addr, int level); // x86 Intrinsics TB_API TB_Node* tb_inst_x86_ldmxcsr(TB_Function* f, TB_Node* a); @@ -1145,8 +1227,8 @@ TB_API TB_Node* tb_inst_x86_rsqrt(TB_Function* f, TB_Node* a); // Control flow TB_API TB_Node* tb_inst_syscall(TB_Function* f, TB_DataType dt, TB_Node* syscall_num, size_t param_count, TB_Node** params); TB_API TB_MultiOutput tb_inst_call(TB_Function* f, TB_FunctionPrototype* proto, TB_Node* target, size_t param_count, TB_Node** params); +TB_API void tb_inst_tailcall(TB_Function* f, TB_FunctionPrototype* proto, TB_Node* target, size_t param_count, TB_Node** params); -// Managed TB_API TB_Node* tb_inst_safepoint(TB_Function* f, TB_Node* poke_site, size_t param_count, TB_Node** params); TB_API TB_Node* tb_inst_incomplete_phi(TB_Function* f, TB_DataType dt, TB_Node* region, size_t preds); @@ -1197,12 +1279,16 @@ TB_API void tb_pass_exit(TB_Passes* opt); TB_API void tb_pass_peephole(TB_Passes* opt, TB_PeepholeFlags flags); TB_API void tb_pass_sroa(TB_Passes* opt); TB_API bool tb_pass_mem2reg(TB_Passes* opt); +TB_API bool tb_pass_loop(TB_Passes* opt); -TB_API void tb_pass_schedule(TB_Passes* opt); +// this just runs the optimizer in the default configuration +TB_API void tb_pass_optimize(TB_Passes* opt); // analysis // print: prints IR in a flattened text form. TB_API bool tb_pass_print(TB_Passes* opt); +// print-dot: prints IR as DOT +TB_API void tb_pass_print_dot(TB_Passes* opt, TB_PrintCallback callback, void* user_data); // codegen TB_API TB_FunctionOutput* tb_pass_codegen(TB_Passes* opt, bool emit_asm); diff --git a/src/tilde/tb.lib b/src/tilde/tb.lib index 4b3cdb9b0acbb2ac4d2b17b1818fe2282a9749f6..510569b0eb2d5e9bd11f3cb47f140b32f8dadb77 100644 GIT binary patch literal 2347218 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 z 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