commit 3d87fb52a556029b741201414ed358f8f16ac45f
parent 85e819c2ea6eee8cb269c6e955467ea78a36794d
Author: erai <erai@omiltem.net>
Date: Mon, 30 Sep 2024 23:35:50 -0400
add symbol table
Diffstat:
M | as.c | | | 404 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- |
M | cc0.c | | | 378 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- |
M | cc1.c | | | 51 | +++++++++++++++++++++++++++++++++++++++++++-------- |
3 files changed, 785 insertions(+), 48 deletions(-)
diff --git a/as.c b/as.c
@@ -161,6 +161,18 @@ struct chunk {
cap: int;
}
+struct section {
+ next: *section;
+ name: *byte;
+ start: int;
+ end: int;
+ index: int;
+ name_offset: int;
+ type: int;
+ link: int;
+ entsize: int;
+}
+
struct assembler {
a: *alloc;
out: *file;
@@ -168,6 +180,16 @@ struct assembler {
text: *chunk;
text_end: *chunk;
bits32: int;
+ symbols: *symbol;
+ sections: *section;
+ num_sections: int;
+}
+
+struct symbol {
+ next: *symbol;
+ name: *byte;
+ label: *label;
+ name_offset: int;
}
setup_assembler(a: *alloc): *assembler {
@@ -175,13 +197,71 @@ setup_assembler(a: *alloc): *assembler {
c = alloc(a, sizeof(*c)): *assembler;
c.a = a;
c.out = 0: *file;
- c.at = 0;
+ c.at = 160; // elf header + program header + multiboot header
c.text = 0:*chunk;
c.text_end = 0:*chunk;
c.bits32 = 0;
+ c.symbols = 0:*symbol;
+ c.num_sections = 0;
+ add_section(c, "", SHT_NULL);
+ add_section(c, ".text", SHT_PROGBITS);
return c;
}
+add_section(c: *assembler, name: *byte, type: int) {
+ var s: *section;
+ var n: *section;
+ var end: int;
+
+ end = c.at;
+
+ emit_align(c, 16, OP_NOP);
+
+ s = alloc(c.a, sizeof(*s)):*section;
+
+ s.next = 0:*section;
+ s.name = name;
+ s.start = c.at;
+ s.end = c.at;
+ s.index = c.num_sections;
+ s.type = type;
+ s.link = 0;
+ s.entsize = 0;
+
+ n = c.sections;
+ if n {
+ loop {
+ if !n.next {
+ break;
+ }
+ n = n.next;
+ }
+ n.end = end;
+ n.next = s;
+ } else {
+ c.sections = s;
+ }
+
+ c.num_sections = c.num_sections + 1;
+}
+
+find_section(c: *assembler, name: *byte): *section {
+ var n: *section;
+ n = c.sections;
+ loop {
+ if !n {
+ break;
+ }
+
+ if strcmp(n.name, name) == 0 {
+ break;
+ }
+
+ n = n.next;
+ }
+ return n;
+}
+
putchar(c: *assembler, ch: int) {
fputc(c.out, ch);
}
@@ -307,6 +387,18 @@ fixup_label(c: *assembler, l: *label) {
}
}
+add_symbol(c: *assembler, name: *byte, l: *label) {
+ var s: *symbol;
+
+ s = alloc(c.a, sizeof(*s)):*symbol;
+
+ s.next = c.symbols;
+ s.name = name;
+ s.label = l;
+
+ c.symbols = s;
+}
+
emit_restorer(c: *assembler) {
as_modri(c, OP_MOVI, R_RAX, 15);
as_op(c, OP_SYSCALL);
@@ -811,6 +903,280 @@ emit_syscall(c: *assembler) {
as_opr(c, OP_PUSHR, R_RAX);
}
+emit_align(c: *assembler, n: int, b: int) {
+ var pad: int;
+
+ pad = c.at & (n - 1);
+
+ if pad == 0 {
+ return;
+ }
+
+ loop {
+ if pad == n {
+ break;
+ }
+
+ as_emit(c, b);
+
+ pad = pad + 1;
+ }
+}
+
+emit_strtab_str(c: *assembler, s: *byte): int {
+ var i: int;
+
+ i = 0;
+ loop {
+ as_emit(c, s[i]:int);
+
+ if !s[i] {
+ break;
+ }
+
+ i = i + 1;
+ }
+
+ return i + 1;
+}
+
+enum {
+ SHT_NULL = 0,
+ SHT_PROGBITS = 1,
+ SHT_SYMTAB = 2,
+ SHT_STRTAB = 3,
+}
+
+emit_sections(c: *assembler): int {
+ var at: int;
+ var s: *section;
+ var y: *symbol;
+ var n: int;
+
+ add_symbol(c, "", 0:*label);
+
+ s = find_section(c, "");
+ s.start = 0;
+ s.end = 0;
+
+ add_section(c, ".strtab", SHT_STRTAB);
+
+ y = c.symbols;
+ loop {
+ if !y {
+ break;
+ }
+
+ y.name_offset = n;
+ n = n + emit_strtab_str(c, y.name);
+
+ y = y.next;
+ }
+
+ add_section(c, ".symtab", SHT_SYMTAB);
+
+ y = c.symbols;
+ loop {
+ if !y {
+ break;
+ }
+
+ // name
+ n = y.name_offset;
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+
+ // info
+ if y.label {
+ n = 0x12;
+ } else {
+ n = 0;
+ }
+ as_emit(c, n);
+
+ // other
+ as_emit(c, 0);
+
+ // section
+ if y.label {
+ n = 1;
+ } else {
+ n = 0;
+ }
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+
+ // addr
+ if y.label {
+ n = y.label.at + 0x100000;
+ } else {
+ n = 0;
+ }
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+ as_emit(c, n >> 32);
+ as_emit(c, n >> 40);
+ as_emit(c, n >> 48);
+ as_emit(c, n >> 56);
+
+ // size
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+
+ y = y.next;
+ }
+
+ s = find_section(c, ".strtab");
+ n = s.index;
+
+ s = find_section(c, ".symtab");
+ s.link = n;
+ s.entsize = 0x18;
+
+ add_section(c, ".shstrtab", SHT_STRTAB);
+
+ s = c.sections;
+ n = 0;
+ loop {
+ if !s {
+ break;
+ }
+
+ s.name_offset = n;
+ n = n + emit_strtab_str(c, s.name);
+
+ s = s.next;
+ }
+
+ s = find_section(c, ".shstrtab");
+ s.end = c.at;
+
+ emit_align(c, 16, OP_NOP);
+
+ at = c.at;
+
+ s = c.sections;
+ loop {
+ if !s {
+ break;
+ }
+
+ // Name
+ n = s.name_offset;
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+
+ // Type
+ n = s.type;
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+
+ // Flags
+ as_emit(c, 6);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+
+ // Addr
+ if s.start == s.end {
+ n = 0;
+ } else {
+ n = s.start + 0x100000;
+ }
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+ as_emit(c, n >> 32);
+ as_emit(c, n >> 40);
+ as_emit(c, n >> 48);
+ as_emit(c, n >> 56);
+
+ // Offset
+ n = s.start;
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+ as_emit(c, n >> 32);
+ as_emit(c, n >> 40);
+ as_emit(c, n >> 48);
+ as_emit(c, n >> 56);
+
+ // Size
+ n = s.end - s.start;
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+ as_emit(c, n >> 32);
+ as_emit(c, n >> 40);
+ as_emit(c, n >> 48);
+ as_emit(c, n >> 56);
+
+ // Link
+ n = s.link;
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+
+ // Info
+ if s.type == SHT_SYMTAB {
+ n = 1;
+ } else {
+ n = 0;
+ }
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+
+ // align
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+ as_emit(c, 0);
+
+ // entsize
+ n = s.entsize;
+ as_emit(c, n);
+ as_emit(c, n >> 8);
+ as_emit(c, n >> 16);
+ as_emit(c, n >> 24);
+ as_emit(c, n >> 32);
+ as_emit(c, n >> 40);
+ as_emit(c, n >> 48);
+ as_emit(c, n >> 56);
+
+ s = s.next;
+ }
+
+ return at;
+}
+
writeout(c: *assembler, start: *label, kstart: *label) {
var b: *chunk;
var i: int;
@@ -823,6 +1189,8 @@ writeout(c: *assembler, start: *label, kstart: *label) {
var mb_flags: int;
var mb_checksum: int;
var mb_addr: int;
+ var s: *section;
+ var shoff: int;
if (!c.out) {
die("output not opened");
@@ -836,10 +1204,10 @@ writeout(c: *assembler, start: *label, kstart: *label) {
die("_start is not defined");
}
} else {
- entry = load_addr + start.at + 128 + 32;
+ entry = load_addr + start.at;
}
- text_size = text_size + 128 + 32;
+ text_size = text_size;
text_end = load_addr + text_size;
mb_magic = 0x1badb002;
@@ -848,12 +1216,14 @@ writeout(c: *assembler, start: *label, kstart: *label) {
mb_addr = load_addr + 120;
if (kstart && kstart.fixed) {
- kentry = load_addr + kstart.at + 128 + 32;
+ kentry = load_addr + kstart.at;
} else {
mb_magic = 0;
kentry = 0;
}
+ shoff = emit_sections(c: *assembler);
+
// magic
putchar(c, 0x7f);
putchar(c, 'E');
@@ -919,14 +1289,14 @@ writeout(c: *assembler, start: *label, kstart: *label) {
putchar(c, 0);
// shoff
- putchar(c, 0);
- putchar(c, 0);
- putchar(c, 0);
- putchar(c, 0);
- putchar(c, 0);
- putchar(c, 0);
- putchar(c, 0);
- putchar(c, 0);
+ putchar(c, shoff);
+ putchar(c, shoff >> 8);
+ putchar(c, shoff >> 16);
+ putchar(c, shoff >> 24);
+ putchar(c, shoff >> 32);
+ putchar(c, shoff >> 40);
+ putchar(c, shoff >> 48);
+ putchar(c, shoff >> 56);
// flags
putchar(c, 0);
@@ -951,12 +1321,14 @@ writeout(c: *assembler, start: *label, kstart: *label) {
putchar(c, 0);
// shnum
- putchar(c, 0);
- putchar(c, 0);
+ putchar(c, c.num_sections);
+ putchar(c, c.num_sections >> 8);
+
+ s = find_section(c, ".shstrtab");
// shstrndx
- putchar(c, 0);
- putchar(c, 0);
+ putchar(c, s.index);
+ putchar(c, s.index >> 8);
// phdr[0].type
putchar(c, 1);
diff --git a/cc0.c b/cc0.c
@@ -21,7 +21,9 @@ struct my_peg_compiler;
struct my_peg_frame;
struct my_peg_node;
struct my_peg_op;
+struct my_section;
struct my_sigaction;
+struct my_symbol;
struct my_type;
struct my_alloc {
struct my_page* my_page;
@@ -33,6 +35,9 @@ struct my_assembler {
struct my_chunk* my_text;
struct my_chunk* my_text_end;
unsigned long my_bits32;
+ struct my_symbol* my_symbols;
+ struct my_section* my_sections;
+ unsigned long my_num_sections;
};
struct my_chunk {
struct my_chunk* my_next;
@@ -187,12 +192,29 @@ struct my_peg_op {
unsigned long my_line;
unsigned long my_col;
};
+struct my_section {
+ struct my_section* my_next;
+ unsigned char* my_name;
+ unsigned long my_start;
+ unsigned long my_end;
+ unsigned long my_index;
+ unsigned long my_name_offset;
+ unsigned long my_type;
+ unsigned long my_link;
+ unsigned long my_entsize;
+};
struct my_sigaction {
unsigned long my_handler;
unsigned long my_flags;
unsigned long my_restorer;
unsigned long my_mask;
};
+struct my_symbol {
+ struct my_symbol* my_next;
+ unsigned char* my_name;
+ struct my_label* my_label;
+ unsigned long my_name_offset;
+};
struct my_type {
unsigned long my_kind;
struct my_decl* my_st;
@@ -494,6 +516,10 @@ enum {
my_R_RSI = 6,
my_R_RSP = 4,
my_R_SS = 2,
+ my_SHT_NULL = 0,
+ my_SHT_PROGBITS = 1,
+ my_SHT_STRTAB = 3,
+ my_SHT_SYMTAB = 2,
my_SIGALRM = 14,
my_SIGCHLD = 17,
my_SIGINT = 2,
@@ -516,6 +542,8 @@ enum {
unsigned char*( my_PEG_tag_to_str)(unsigned long my_tag);
unsigned char*( my_P_tag_to_str)(unsigned long my_tag);
void( my__start)(unsigned long my_argc,unsigned char** my_argv,unsigned char** my_envp);
+void( my_add_section)(struct my_assembler* my_c,unsigned char* my_name,unsigned long my_type);
+void( my_add_symbol)(struct my_assembler* my_c,unsigned char* my_name,struct my_label* my_l);
void( my_addfixup)(struct my_assembler* my_c,struct my_label* my_l);
unsigned char*( my_alloc)(struct my_alloc* my_c,unsigned long my_size);
unsigned long( my_any)(struct my_peg* my_c);
@@ -571,6 +599,7 @@ void( my_defun)(struct my_compiler* my_c,struct my_node* my_n);
void( my_die)(unsigned char* my_msg);
void( my_emit)(struct my_assembler* my_c,unsigned long my_x);
void( my_emit_add)(struct my_assembler* my_c);
+void( my_emit_align)(struct my_assembler* my_c,unsigned long my_n,unsigned long my_b);
void( my_emit_and)(struct my_assembler* my_c);
void( my_emit_blob)(struct my_assembler* my_c,unsigned char* my_s,unsigned long my_n);
void( my_emit_builtin)(struct my_compiler* my_c);
@@ -602,9 +631,11 @@ void( my_emit_ptr)(struct my_assembler* my_c,struct my_label* my_l);
void( my_emit_restorer)(struct my_assembler* my_c);
void( my_emit_ret)(struct my_assembler* my_c);
void( my_emit_rsh)(struct my_assembler* my_c);
+unsigned long( my_emit_sections)(struct my_assembler* my_c);
void( my_emit_ssr)(struct my_compiler* my_c);
void( my_emit_store)(struct my_assembler* my_c,struct my_type* my_t);
void( my_emit_str)(struct my_assembler* my_c,unsigned char* my_s);
+unsigned long( my_emit_strtab_str)(struct my_assembler* my_c,unsigned char* my_s);
void( my_emit_sub)(struct my_assembler* my_c);
void( my_emit_syscall)(struct my_assembler* my_c);
void( my_emit_ud)(struct my_assembler* my_c);
@@ -621,6 +652,7 @@ void( my_fflush)(struct my_file* my_f);
unsigned long( my_fgetc)(struct my_file* my_f);
void( my_fillpos)(struct my_parser* my_c,struct my_node* my_n);
struct my_decl*( my_find)(struct my_compiler* my_c,unsigned char* my_name,unsigned char* my_member_name,unsigned long my_make);
+struct my_section*( my_find_section)(struct my_assembler* my_c,unsigned char* my_name);
struct my_decl*( my_first_decl)(struct my_compiler* my_c);
void( my_fixup)(struct my_assembler* my_c,unsigned char* my_here,unsigned long my_delta);
void( my_fixup_label)(struct my_assembler* my_c,struct my_label* my_l);
@@ -1145,6 +1177,44 @@ void( my__start)(unsigned long my_argc,unsigned char** my_argv,unsigned char** m
(my_main)((my_argc),(my_argv),(my_envp));
(my_exit)((0UL));
}
+void( my_add_section)(struct my_assembler* my_c,unsigned char* my_name,unsigned long my_type){
+ struct my_section* my_s = 0;
+ struct my_section* my_n = 0;
+ unsigned long my_end = 0;
+ (my_end)=((my_c)->my_at);
+ (my_emit_align)((my_c),(16UL),(my_OP_NOP));
+ (my_s)=((struct my_section*)(my_alloc)(((my_c)->my_a),(72UL)));
+ ((my_s)->my_next)=((struct my_section*)0UL);
+ ((my_s)->my_name)=(my_name);
+ ((my_s)->my_start)=((my_c)->my_at);
+ ((my_s)->my_end)=((my_c)->my_at);
+ ((my_s)->my_index)=((my_c)->my_num_sections);
+ ((my_s)->my_type)=(my_type);
+ ((my_s)->my_link)=(0UL);
+ ((my_s)->my_entsize)=(0UL);
+ (my_n)=((my_c)->my_sections);
+ if (my_n) {
+ while (1) {
+ if ((unsigned long)(!((my_n)->my_next))) {
+ break;
+ }
+ (my_n)=((my_n)->my_next);
+ }
+ ((my_n)->my_end)=(my_end);
+ ((my_n)->my_next)=(my_s);
+ } else {
+ ((my_c)->my_sections)=(my_s);
+ }
+ ((my_c)->my_num_sections)=((unsigned long)(((unsigned long)((my_c)->my_num_sections))+((unsigned long)(1UL))));
+}
+void( my_add_symbol)(struct my_assembler* my_c,unsigned char* my_name,struct my_label* my_l){
+ struct my_symbol* my_s = 0;
+ (my_s)=((struct my_symbol*)(my_alloc)(((my_c)->my_a),(32UL)));
+ ((my_s)->my_next)=((my_c)->my_symbols);
+ ((my_s)->my_name)=(my_name);
+ ((my_s)->my_label)=(my_l);
+ ((my_c)->my_symbols)=(my_s);
+}
void( my_addfixup)(struct my_assembler* my_c,struct my_label* my_l){
struct my_fixup* my_f = 0;
unsigned char* my_here = 0;
@@ -1845,8 +1915,8 @@ void( my_compile_func)(struct my_compiler* my_c,struct my_decl* my_d){
} else {
(my_pragma)=(0UL);
}
- (my_emit_str)(((my_c)->my_as),((my_d)->my_name));
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),((my_d)->my_func_preamble),(my_pragma));
(my_compile_stmt)((my_c),(my_d),(((my_d)->my_func_def)->my_b),((struct my_label*)0UL),((struct my_label*)0UL));
(my_emit_num)(((my_c)->my_as),(0UL));
@@ -2787,6 +2857,20 @@ void( my_emit_add)(struct my_assembler* my_c){
(my_as_modrr)((my_c),(my_OP_ADDRM),(my_R_RAX),(my_R_RDX));
(my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX));
}
+void( my_emit_align)(struct my_assembler* my_c,unsigned long my_n,unsigned long my_b){
+ unsigned long my_pad = 0;
+ (my_pad)=((unsigned long)(((unsigned long)((my_c)->my_at))&((unsigned long)((unsigned long)(((unsigned long)(my_n))-((unsigned long)(1UL)))))));
+ if ((unsigned long)(((long)(my_pad))==((long)(0UL)))) {
+ return;
+ }
+ while (1) {
+ if ((unsigned long)(((long)(my_pad))==((long)(my_n)))) {
+ break;
+ }
+ (my_as_emit)((my_c),(my_b));
+ (my_pad)=((unsigned long)(((unsigned long)(my_pad))+((unsigned long)(1UL))));
+ }
+}
void( my_emit_and)(struct my_assembler* my_c){
(my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX));
(my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX));
@@ -2826,6 +2910,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"syscall"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_emit_syscall)(((my_c)->my_as));
(my_emit_ret)(((my_c)->my_as));
@@ -2833,11 +2918,13 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"_restorer"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_restorer)(((my_c)->my_as));
}
(my_d)=((my_find)((my_c),((unsigned char *)"_include"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_op)(((my_c)->my_as),(my_OP_UD2));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -2846,6 +2933,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"ud2"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_op)(((my_c)->my_as),(my_OP_UD2));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -2854,6 +2942,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"cpuid"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL));
@@ -2878,6 +2967,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"inb"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_op)(((my_c)->my_as),(my_OP_IN));
@@ -2887,6 +2977,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"outb"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
@@ -2897,6 +2988,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"inw"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_emit)(((my_c)->my_as),(my_OP_OS));
@@ -2907,6 +2999,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"outw"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
@@ -2918,6 +3011,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"ind"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_op)(((my_c)->my_as),(my_OP_IND));
@@ -2927,6 +3021,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"outd"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
@@ -2937,6 +3032,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"rdmsr"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_op)(((my_c)->my_as),(my_OP_RDMSR));
@@ -2949,6 +3045,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"wrmsr"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_MOVE),(my_R_RDX),(my_R_RAX));
@@ -2962,6 +3059,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"rdcr0"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_RDCRR),(my_R_CR0),(my_R_RAX));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -2970,6 +3068,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"wrcr0"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_WRCRR),(my_R_CR0),(my_R_RAX));
@@ -2979,6 +3078,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"rdcr2"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_RDCRR),(my_R_CR2),(my_R_RAX));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -2987,6 +3087,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"wrcr2"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_WRCRR),(my_R_CR2),(my_R_RAX));
@@ -2996,6 +3097,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"rdcr3"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_RDCRR),(my_R_CR3),(my_R_RAX));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -3004,6 +3106,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"wrcr3"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_WRCRR),(my_R_CR3),(my_R_RAX));
@@ -3013,6 +3116,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"rdcr4"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_RDCRR),(my_R_CR4),(my_R_RAX));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -3021,6 +3125,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"wrcr4"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_WRCRR),(my_R_CR4),(my_R_RAX));
@@ -3030,6 +3135,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"lgdt"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modri)(((my_c)->my_as),(my_OP_SUBI),(my_R_RSP),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
@@ -3045,6 +3151,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"lidt"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modri)(((my_c)->my_as),(my_OP_SUBI),(my_R_RSP),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
@@ -3060,6 +3167,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"lldt"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modr)(((my_c)->my_as),(my_OP_LLDTM),(my_R_RAX));
@@ -3069,6 +3177,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"ltr"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modr)(((my_c)->my_as),(my_OP_LTRM),(my_R_RAX));
@@ -3078,6 +3187,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"lseg"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_WRSR),(my_R_ES),(my_R_RAX));
@@ -3106,6 +3216,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"hlt"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_op)(((my_c)->my_as),(my_OP_HLT));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -3114,6 +3225,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"cli"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_op)(((my_c)->my_as),(my_OP_CLI));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -3122,6 +3234,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"sti"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_op)(((my_c)->my_as),(my_OP_STI));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -3130,6 +3243,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"rdflags"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_op)(((my_c)->my_as),(my_OP_PUSHF));
(my_emit_ret)(((my_c)->my_as));
@@ -3137,6 +3251,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"wrflags"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_op)(((my_c)->my_as),(my_OP_PUSHF));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL));
@@ -3147,6 +3262,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"wbinvld"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modm)(((my_c)->my_as),(my_OP_WBINVD),(my_R_RAX),(0UL),(0UL),(0UL));
@@ -3156,6 +3272,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"invlpg"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modm)(((my_c)->my_as),(my_OP_INVLPGM),(my_R_RAX),(0UL),(0UL),(0UL));
@@ -3165,16 +3282,19 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"_ssr0"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_ssr)((my_c));
}
(my_d)=((my_find)((my_c),((unsigned char *)"_isr0"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_isr)((my_c));
}
(my_d)=((my_find)((my_c),((unsigned char *)"_rgs"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_emit)(((my_c)->my_as),(my_OP_GS));
@@ -3185,6 +3305,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"_r32"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(16UL));
(((my_c)->my_as)->my_bits32)=(1UL);
@@ -3196,6 +3317,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"_w32"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
@@ -3208,6 +3330,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"_r16"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrr)(((my_c)->my_as),(my_OP_XORRM),(my_R_RAX),(my_R_RAX));
@@ -3220,6 +3343,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"_w16"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(16UL));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL));
@@ -3232,6 +3356,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"_rdrand"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_emit_preamble)(((my_c)->my_as),(0UL),(0UL));
(my_as_modr)(((my_c)->my_as),(my_OP_RDRAND),(my_R_RAX));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RAX));
@@ -3240,6 +3365,7 @@ void( my_emit_builtin)(struct my_compiler* my_c){
(my_d)=((my_find)((my_c),((unsigned char *)"taskswitch"),((unsigned char*)0UL),(1UL)));
if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) {
(my_fixup_label)(((my_c)->my_as),((my_d)->my_func_label));
+ (my_add_symbol)(((my_c)->my_as),((my_d)->my_name),((my_d)->my_func_label));
(my_as_opr)(((my_c)->my_as),(my_OP_PUSHR),(my_R_RBP));
(my_as_op)(((my_c)->my_as),(my_OP_PUSHF));
(my_as_modrm)(((my_c)->my_as),(my_OP_LOAD),(my_R_RBP),(my_R_RSP),(0UL),(0UL),(24UL));
@@ -3689,6 +3815,182 @@ void( my_emit_rsh)(struct my_assembler* my_c){
(my_as_modr)((my_c),(my_OP_SHRM),(my_R_RAX));
(my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX));
}
+unsigned long( my_emit_sections)(struct my_assembler* my_c){
+ unsigned long my_at = 0;
+ struct my_section* my_s = 0;
+ struct my_symbol* my_y = 0;
+ unsigned long my_n = 0;
+ (my_add_symbol)((my_c),((unsigned char *)""),((struct my_label*)0UL));
+ (my_s)=((my_find_section)((my_c),((unsigned char *)"")));
+ ((my_s)->my_start)=(0UL);
+ ((my_s)->my_end)=(0UL);
+ (my_add_section)((my_c),((unsigned char *)".strtab"),(my_SHT_STRTAB));
+ (my_y)=((my_c)->my_symbols);
+ while (1) {
+ if ((unsigned long)(!(my_y))) {
+ break;
+ }
+ ((my_y)->my_name_offset)=(my_n);
+ (my_n)=((unsigned long)(((unsigned long)(my_n))+((unsigned long)((my_emit_strtab_str)((my_c),((my_y)->my_name))))));
+ (my_y)=((my_y)->my_next);
+ }
+ (my_add_section)((my_c),((unsigned char *)".symtab"),(my_SHT_SYMTAB));
+ (my_y)=((my_c)->my_symbols);
+ while (1) {
+ if ((unsigned long)(!(my_y))) {
+ break;
+ }
+ (my_n)=((my_y)->my_name_offset);
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ if ((my_y)->my_label) {
+ (my_n)=(18UL);
+ } else {
+ (my_n)=(0UL);
+ }
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),(0UL));
+ if ((my_y)->my_label) {
+ (my_n)=(1UL);
+ } else {
+ (my_n)=(0UL);
+ }
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ if ((my_y)->my_label) {
+ (my_n)=((unsigned long)(((unsigned long)(((my_y)->my_label)->my_at))+((unsigned long)(1048576UL))));
+ } else {
+ (my_n)=(0UL);
+ }
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(32UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(40UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(48UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(56UL)))));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_y)=((my_y)->my_next);
+ }
+ (my_s)=((my_find_section)((my_c),((unsigned char *)".strtab")));
+ (my_n)=((my_s)->my_index);
+ (my_s)=((my_find_section)((my_c),((unsigned char *)".symtab")));
+ ((my_s)->my_link)=(my_n);
+ ((my_s)->my_entsize)=(24UL);
+ (my_add_section)((my_c),((unsigned char *)".shstrtab"),(my_SHT_STRTAB));
+ (my_s)=((my_c)->my_sections);
+ (my_n)=(0UL);
+ while (1) {
+ if ((unsigned long)(!(my_s))) {
+ break;
+ }
+ ((my_s)->my_name_offset)=(my_n);
+ (my_n)=((unsigned long)(((unsigned long)(my_n))+((unsigned long)((my_emit_strtab_str)((my_c),((my_s)->my_name))))));
+ (my_s)=((my_s)->my_next);
+ }
+ (my_s)=((my_find_section)((my_c),((unsigned char *)".shstrtab")));
+ ((my_s)->my_end)=((my_c)->my_at);
+ (my_emit_align)((my_c),(16UL),(my_OP_NOP));
+ (my_at)=((my_c)->my_at);
+ (my_s)=((my_c)->my_sections);
+ while (1) {
+ if ((unsigned long)(!(my_s))) {
+ break;
+ }
+ (my_n)=((my_s)->my_name_offset);
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_n)=((my_s)->my_type);
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_as_emit)((my_c),(6UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ if ((unsigned long)(((long)((my_s)->my_start))==((long)((my_s)->my_end)))) {
+ (my_n)=(0UL);
+ } else {
+ (my_n)=((unsigned long)(((unsigned long)((my_s)->my_start))+((unsigned long)(1048576UL))));
+ }
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(32UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(40UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(48UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(56UL)))));
+ (my_n)=((my_s)->my_start);
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(32UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(40UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(48UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(56UL)))));
+ (my_n)=((unsigned long)(((unsigned long)((my_s)->my_end))-((unsigned long)((my_s)->my_start))));
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(32UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(40UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(48UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(56UL)))));
+ (my_n)=((my_s)->my_link);
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ if ((unsigned long)(((long)((my_s)->my_type))==((long)(my_SHT_SYMTAB)))) {
+ (my_n)=(1UL);
+ } else {
+ (my_n)=(0UL);
+ }
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(0UL));
+ (my_n)=((my_s)->my_entsize);
+ (my_as_emit)((my_c),(my_n));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(32UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(40UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(48UL)))));
+ (my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(56UL)))));
+ (my_s)=((my_s)->my_next);
+ }
+ return my_at;
+}
void( my_emit_ssr)(struct my_compiler* my_c){
struct my_decl* my_d = 0;
struct my_decl* my_v = 0;
@@ -3812,6 +4114,18 @@ void( my_emit_str)(struct my_assembler* my_c,unsigned char* my_s){
(my_fixup_label)((my_c),(my_b));
(my_emit_ptr)((my_c),(my_a));
}
+unsigned long( my_emit_strtab_str)(struct my_assembler* my_c,unsigned char* my_s){
+ unsigned long my_i = 0;
+ (my_i)=(0UL);
+ while (1) {
+ (my_as_emit)((my_c),((unsigned long)(my_s)[my_i]));
+ if ((unsigned long)(!((my_s)[my_i]))) {
+ break;
+ }
+ (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL))));
+ }
+ return (unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)));
+}
void( my_emit_sub)(struct my_assembler* my_c){
(my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX));
(my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX));
@@ -4032,6 +4346,20 @@ struct my_decl*( my_find)(struct my_compiler* my_c,unsigned char* my_name,unsign
(*(my_link))=(my_d);
return my_d;
}
+struct my_section*( my_find_section)(struct my_assembler* my_c,unsigned char* my_name){
+ struct my_section* my_n = 0;
+ (my_n)=((my_c)->my_sections);
+ while (1) {
+ if ((unsigned long)(!(my_n))) {
+ break;
+ }
+ if ((unsigned long)(((long)((my_strcmp)(((my_n)->my_name),(my_name))))==((long)(0UL)))) {
+ break;
+ }
+ (my_n)=((my_n)->my_next);
+ }
+ return my_n;
+}
struct my_decl*( my_first_decl)(struct my_compiler* my_c){
struct my_decl* my_d = 0;
(my_d)=((my_c)->my_decls);
@@ -8737,13 +9065,17 @@ void( my_setup_alloc)(struct my_alloc* my_c){
}
struct my_assembler*( my_setup_assembler)(struct my_alloc* my_a){
struct my_assembler* my_c = 0;
- (my_c)=((struct my_assembler*)(my_alloc)((my_a),(48UL)));
+ (my_c)=((struct my_assembler*)(my_alloc)((my_a),(72UL)));
((my_c)->my_a)=(my_a);
((my_c)->my_out)=((struct my_file*)0UL);
- ((my_c)->my_at)=(0UL);
+ ((my_c)->my_at)=(160UL);
((my_c)->my_text)=((struct my_chunk*)0UL);
((my_c)->my_text_end)=((struct my_chunk*)0UL);
((my_c)->my_bits32)=(0UL);
+ ((my_c)->my_symbols)=((struct my_symbol*)0UL);
+ ((my_c)->my_num_sections)=(0UL);
+ (my_add_section)((my_c),((unsigned char *)""),(my_SHT_NULL));
+ (my_add_section)((my_c),((unsigned char *)".text"),(my_SHT_PROGBITS));
return my_c;
}
struct my_parser*( my_setup_parser)(struct my_alloc* my_a){
@@ -9184,10 +9516,7 @@ void( my_typecheck_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my
}
(my_v)=((my_find)((my_c),((my_d)->my_name),(((my_n)->my_a)->my_s),(0UL)));
if ((unsigned long)((my_v)&&((my_v)->my_var_defined))) {
- (my_emit_lea)(((my_c)->my_as),((my_v)->my_var_offset));
(((my_n)->my_a)->my_t)=((my_v)->my_var_type);
- (my_emit_load)(((my_c)->my_as),(((my_n)->my_a)->my_t));
- (my_emit_call)(((my_c)->my_as),((my_count_args)((my_c),((((my_n)->my_a)->my_t)->my_arg))));
} else if ((unsigned long)(!((my_strcmp)((((my_n)->my_a)->my_s),((unsigned char *)"_include"))))) {
(my_v)=((my_find)((my_c),(((my_n)->my_a)->my_s),((unsigned char*)0UL),(0UL)));
if ((unsigned long)(((unsigned long)(!(my_v)))||((unsigned long)(!((my_v)->my_func_defined))))) {
@@ -9200,11 +9529,9 @@ void( my_typecheck_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my
(my_cdie)((my_c),((unsigned char *)"no such function"));
}
(((my_n)->my_a)->my_t)=((my_v)->my_func_type);
- (my_emit_lcall)(((my_c)->my_as),((my_v)->my_func_label),((my_count_args)((my_c),((((my_n)->my_a)->my_t)->my_arg))));
}
} else {
(my_typecheck_expr)((my_c),(my_d),((my_n)->my_a),(1UL));
- (my_emit_call)(((my_c)->my_as),((my_count_args)((my_c),((((my_n)->my_a)->my_t)->my_arg))));
}
if ((unsigned long)(((long)((((my_n)->my_a)->my_t)->my_kind))!=((long)(my_TY_FUNC)))) {
(my_cdie)((my_c),((unsigned char *)"calling not a function"));
@@ -9356,7 +9683,6 @@ void( my_typecheck_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my
(my_cdie)((my_c),((unsigned char *)"not lexpr"));
}
(my_typecheck_expr)((my_c),(my_d),((my_n)->my_a),(1UL));
- (my_emit_num)(((my_c)->my_as),(1UL));
if ((unsigned long)(!((my_type_isprim)((((my_n)->my_a)->my_t))))) {
(my_cdie)((my_c),((unsigned char *)"not an prim"));
}
@@ -9702,6 +10028,8 @@ void( my_writeout)(struct my_assembler* my_c,struct my_label* my_start,struct my
unsigned long my_mb_flags = 0;
unsigned long my_mb_checksum = 0;
unsigned long my_mb_addr = 0;
+ struct my_section* my_s = 0;
+ unsigned long my_shoff = 0;
if ((unsigned long)(!((my_c)->my_out))) {
(my_die)(((unsigned char *)"output not opened"));
}
@@ -9712,20 +10040,21 @@ void( my_writeout)(struct my_assembler* my_c,struct my_label* my_start,struct my
(my_die)(((unsigned char *)"_start is not defined"));
}
} else {
- (my_entry)=((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_load_addr))+((unsigned long)((my_start)->my_at)))))+((unsigned long)(128UL)))))+((unsigned long)(32UL))));
+ (my_entry)=((unsigned long)(((unsigned long)(my_load_addr))+((unsigned long)((my_start)->my_at))));
}
- (my_text_size)=((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_text_size))+((unsigned long)(128UL)))))+((unsigned long)(32UL))));
+ (my_text_size)=(my_text_size);
(my_text_end)=((unsigned long)(((unsigned long)(my_load_addr))+((unsigned long)(my_text_size))));
(my_mb_magic)=(464367618UL);
(my_mb_flags)=(65539UL);
(my_mb_checksum)=((unsigned long)(-(unsigned long)((unsigned long)(((unsigned long)(my_mb_magic))+((unsigned long)(my_mb_flags))))));
(my_mb_addr)=((unsigned long)(((unsigned long)(my_load_addr))+((unsigned long)(120UL))));
if ((unsigned long)((my_kstart)&&((my_kstart)->my_fixed))) {
- (my_kentry)=((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_load_addr))+((unsigned long)((my_kstart)->my_at)))))+((unsigned long)(128UL)))))+((unsigned long)(32UL))));
+ (my_kentry)=((unsigned long)(((unsigned long)(my_load_addr))+((unsigned long)((my_kstart)->my_at))));
} else {
(my_mb_magic)=(0UL);
(my_kentry)=(0UL);
}
+ (my_shoff)=((my_emit_sections)(((struct my_assembler*)my_c)));
(my_putchar)((my_c),(127UL));
(my_putchar)((my_c),(69));
(my_putchar)((my_c),(76));
@@ -9766,14 +10095,14 @@ void( my_writeout)(struct my_assembler* my_c,struct my_label* my_start,struct my
(my_putchar)((my_c),(0UL));
(my_putchar)((my_c),(0UL));
(my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
+ (my_putchar)((my_c),(my_shoff));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)(my_shoff))>>((unsigned long)(8UL)))));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)(my_shoff))>>((unsigned long)(16UL)))));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)(my_shoff))>>((unsigned long)(24UL)))));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)(my_shoff))>>((unsigned long)(32UL)))));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)(my_shoff))>>((unsigned long)(40UL)))));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)(my_shoff))>>((unsigned long)(48UL)))));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)(my_shoff))>>((unsigned long)(56UL)))));
(my_putchar)((my_c),(0UL));
(my_putchar)((my_c),(0UL));
(my_putchar)((my_c),(0UL));
@@ -9786,10 +10115,11 @@ void( my_writeout)(struct my_assembler* my_c,struct my_label* my_start,struct my
(my_putchar)((my_c),(0UL));
(my_putchar)((my_c),(64UL));
(my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
- (my_putchar)((my_c),(0UL));
+ (my_putchar)((my_c),((my_c)->my_num_sections));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)((my_c)->my_num_sections))>>((unsigned long)(8UL)))));
+ (my_s)=((my_find_section)((my_c),((unsigned char *)".shstrtab")));
+ (my_putchar)((my_c),((my_s)->my_index));
+ (my_putchar)((my_c),((unsigned long)(((unsigned long)((my_s)->my_index))>>((unsigned long)(8UL)))));
(my_putchar)((my_c),(1UL));
(my_putchar)((my_c),(0UL));
(my_putchar)((my_c),(0UL));
diff --git a/cc1.c b/cc1.c
@@ -537,8 +537,8 @@ compile_func(c: *compiler, d: *decl) {
}
// Compile the function body
- emit_str(c.as, d.name);
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, d.func_preamble, pragma);
compile_stmt(c, d, d.func_def.b, 0:*label, 0:*label);
emit_num(c.as, 0);
@@ -610,10 +610,7 @@ typecheck_expr(c: *compiler, d: *decl, n: *node, rhs: int) {
v = find(c, d.name, n.a.s, 0);
if (v && v.var_defined) {
- emit_lea(c.as, v.var_offset);
n.a.t = v.var_type;
- emit_load(c.as, n.a.t);
- emit_call(c.as, count_args(c, n.a.t.arg));
} else if !strcmp(n.a.s, "_include") {
v = find(c, n.a.s, 0:*byte, 0);
if (!v || !v.func_defined) {
@@ -626,11 +623,9 @@ typecheck_expr(c: *compiler, d: *decl, n: *node, rhs: int) {
cdie(c, "no such function");
}
n.a.t = v.func_type;
- emit_lcall(c.as, v.func_label, count_args(c, n.a.t.arg));
}
} else {
typecheck_expr(c, d, n.a, 1);
- emit_call(c.as, count_args(c, n.a.t.arg));
}
if (n.a.t.kind != TY_FUNC) {
@@ -831,8 +826,6 @@ typecheck_expr(c: *compiler, d: *decl, n: *node, rhs: int) {
typecheck_expr(c, d, n.a, 1);
- emit_num(c.as, 1);
-
if (!type_isprim(n.a.t)) {
cdie(c, "not an prim");
}
@@ -1903,6 +1896,7 @@ emit_builtin(c: *compiler) {
d = find(c, "syscall", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
emit_syscall(c.as);
emit_ret(c.as);
@@ -1911,12 +1905,14 @@ emit_builtin(c: *compiler) {
d = find(c, "_restorer", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_restorer(c.as);
}
d = find(c, "_include", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_op(c.as, OP_UD2);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -1926,6 +1922,7 @@ emit_builtin(c: *compiler) {
d = find(c, "ud2", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_op(c.as, OP_UD2);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -1935,6 +1932,7 @@ emit_builtin(c: *compiler) {
d = find(c, "cpuid", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDI, R_RBP, 0, 0, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RDI, 0, 0, 0);
@@ -1960,6 +1958,7 @@ emit_builtin(c: *compiler) {
d = find(c, "inb", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDX, R_RBP, 0, 0, 16);
as_op(c.as, OP_IN);
@@ -1970,6 +1969,7 @@ emit_builtin(c: *compiler) {
d = find(c, "outb", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDX, R_RBP, 0, 0, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -1981,6 +1981,7 @@ emit_builtin(c: *compiler) {
d = find(c, "inw", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDX, R_RBP, 0, 0, 16);
as_emit(c.as, OP_OS);
@@ -1992,6 +1993,7 @@ emit_builtin(c: *compiler) {
d = find(c, "outw", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDX, R_RBP, 0, 0, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -2004,6 +2006,7 @@ emit_builtin(c: *compiler) {
d = find(c, "ind", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDX, R_RBP, 0, 0, 16);
as_op(c.as, OP_IND);
@@ -2014,6 +2017,7 @@ emit_builtin(c: *compiler) {
d = find(c, "outd", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDX, R_RBP, 0, 0, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -2025,6 +2029,7 @@ emit_builtin(c: *compiler) {
d = find(c, "rdmsr", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RCX, R_RBP, 0, 0, 16);
as_op(c.as, OP_RDMSR);
@@ -2038,6 +2043,7 @@ emit_builtin(c: *compiler) {
d = find(c, "wrmsr", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
as_modrr(c.as, OP_MOVE, R_RDX, R_RAX);
@@ -2052,6 +2058,7 @@ emit_builtin(c: *compiler) {
d = find(c, "rdcr0", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrr(c.as, OP_RDCRR, R_CR0, R_RAX);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2061,6 +2068,7 @@ emit_builtin(c: *compiler) {
d = find(c, "wrcr0", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RCX, R_RBP, 0, 0, 16);
as_modrr(c.as, OP_WRCRR, R_CR0, R_RAX);
@@ -2071,6 +2079,7 @@ emit_builtin(c: *compiler) {
d = find(c, "rdcr2", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrr(c.as, OP_RDCRR, R_CR2, R_RAX);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2080,6 +2089,7 @@ emit_builtin(c: *compiler) {
d = find(c, "wrcr2", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RCX, R_RBP, 0, 0, 16);
as_modrr(c.as, OP_WRCRR, R_CR2, R_RAX);
@@ -2090,6 +2100,7 @@ emit_builtin(c: *compiler) {
d = find(c, "rdcr3", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrr(c.as, OP_RDCRR, R_CR3, R_RAX);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2099,6 +2110,7 @@ emit_builtin(c: *compiler) {
d = find(c, "wrcr3", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RCX, R_RBP, 0, 0, 16);
as_modrr(c.as, OP_WRCRR, R_CR3, R_RAX);
@@ -2109,6 +2121,7 @@ emit_builtin(c: *compiler) {
d = find(c, "rdcr4", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrr(c.as, OP_RDCRR, R_CR4, R_RAX);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2118,6 +2131,7 @@ emit_builtin(c: *compiler) {
d = find(c, "wrcr4", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RCX, R_RBP, 0, 0, 16);
as_modrr(c.as, OP_WRCRR, R_CR4, R_RAX);
@@ -2128,6 +2142,7 @@ emit_builtin(c: *compiler) {
d = find(c, "lgdt", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modri(c.as, OP_SUBI, R_RSP, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -2144,6 +2159,7 @@ emit_builtin(c: *compiler) {
d = find(c, "lidt", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modri(c.as, OP_SUBI, R_RSP, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -2160,6 +2176,7 @@ emit_builtin(c: *compiler) {
d = find(c, "lldt", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 16);
as_modr(c.as, OP_LLDTM, R_RAX);
@@ -2170,6 +2187,7 @@ emit_builtin(c: *compiler) {
d = find(c, "ltr", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 16);
as_modr(c.as, OP_LTRM, R_RAX);
@@ -2180,6 +2198,7 @@ emit_builtin(c: *compiler) {
d = find(c, "lseg", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
// es ds fs gs
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -2215,6 +2234,7 @@ emit_builtin(c: *compiler) {
d = find(c, "hlt", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_op(c.as, OP_HLT);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2224,6 +2244,7 @@ emit_builtin(c: *compiler) {
d = find(c, "cli", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_op(c.as, OP_CLI);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2233,6 +2254,7 @@ emit_builtin(c: *compiler) {
d = find(c, "sti", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_op(c.as, OP_STI);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2242,6 +2264,7 @@ emit_builtin(c: *compiler) {
d = find(c, "rdflags", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_op(c.as, OP_PUSHF);
emit_ret(c.as);
@@ -2250,6 +2273,7 @@ emit_builtin(c: *compiler) {
d = find(c, "wrflags", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_op(c.as, OP_PUSHF);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 16);
@@ -2261,6 +2285,7 @@ emit_builtin(c: *compiler) {
d = find(c, "wbinvld", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 16);
as_modm(c.as, OP_WBINVD, R_RAX, 0, 0, 0);
@@ -2271,6 +2296,7 @@ emit_builtin(c: *compiler) {
d = find(c, "invlpg", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 16);
as_modm(c.as, OP_INVLPGM, R_RAX, 0, 0, 0);
@@ -2281,18 +2307,21 @@ emit_builtin(c: *compiler) {
d = find(c, "_ssr0", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_ssr(c);
}
d = find(c, "_isr0", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_isr(c);
}
d = find(c, "_rgs", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RSI, R_RBP, 0, 0, 16);
as_emit(c.as, OP_GS);
@@ -2304,6 +2333,7 @@ emit_builtin(c: *compiler) {
d = find(c, "_r32", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RSI, R_RBP, 0, 0, 16);
c.as.bits32 = 1;
@@ -2316,6 +2346,7 @@ emit_builtin(c: *compiler) {
d = find(c, "_w32", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDI, R_RBP, 0, 0, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -2329,6 +2360,7 @@ emit_builtin(c: *compiler) {
d = find(c, "_r16", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RSI, R_RBP, 0, 0, 16);
as_modrr(c.as, OP_XORRM, R_RAX, R_RAX);
@@ -2342,6 +2374,7 @@ emit_builtin(c: *compiler) {
d = find(c, "_w16", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modrm(c.as, OP_LOAD, R_RDI, R_RBP, 0, 0, 16);
as_modrm(c.as, OP_LOAD, R_RAX, R_RBP, 0, 0, 24);
@@ -2355,6 +2388,7 @@ emit_builtin(c: *compiler) {
d = find(c, "_rdrand", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
emit_preamble(c.as, 0, 0);
as_modr(c.as, OP_RDRAND, R_RAX);
as_opr(c.as, OP_PUSHR, R_RAX);
@@ -2364,6 +2398,7 @@ emit_builtin(c: *compiler) {
d = find(c, "taskswitch", 0:*byte, 1);
if (d.func_defined && !d.func_label.fixed) {
fixup_label(c.as, d.func_label);
+ add_symbol(c.as, d.name, d.func_label);
as_opr(c.as, OP_PUSHR, R_RBP);
as_op(c.as, OP_PUSHF);