Skip to content

Commit c6c0000

Browse files
committed
WASM_X64: Support elf headers, footer in asm text
1 parent ca76842 commit c6c0000

File tree

1 file changed

+81
-3
lines changed

1 file changed

+81
-3
lines changed

src/libasr/codegen/x86_assembler.h

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -436,8 +436,7 @@ class X86Assembler {
436436
m_origin = 0x08048000;
437437
#ifdef LFORTRAN_ASM_PRINT
438438
if (bits64) {
439-
m_asm_code = "BITS 64\n";
440-
emit(" ", "org " + i2s((uint64_t)m_origin) + "\n"); // specify origin info
439+
m_asm_code = "";
441440
} else {
442441
m_asm_code = "BITS 32\n";
443442
emit(" ", "org " + i2s(m_origin) + "\n"); // specify origin info
@@ -447,7 +446,86 @@ class X86Assembler {
447446

448447
#ifdef LFORTRAN_ASM_PRINT
449448
std::string get_asm() {
450-
return m_asm_code;
449+
450+
std::string header =
451+
R"(BITS 64
452+
org )" + i2s((uint64_t) m_origin) + R"(
453+
454+
ehdr:
455+
db 0x7f
456+
db 0x45
457+
db 0x4c
458+
db 0x46
459+
db 0x02
460+
db 0x01
461+
db 0x01
462+
db 0x00
463+
db 0x00
464+
db 0x00
465+
db 0x00
466+
db 0x00
467+
db 0x00
468+
db 0x00
469+
db 0x00
470+
db 0x00
471+
dw 0x0002
472+
dw 0x003e
473+
dd 0x00000001
474+
dq _start
475+
dq e_phoff
476+
dq 0x0000000000000000
477+
dd 0x00000000
478+
dw ehdrsize
479+
dw phdrsize
480+
dw 0x0003
481+
dw 0x0000
482+
dw 0x0000
483+
dw 0x0000
484+
phdr:
485+
dd 0x00000001
486+
dd 0x00000004
487+
dq header_segment_offset
488+
dq header_segment_start
489+
dq header_segment_start
490+
dq header_segment_size
491+
dq header_segment_size
492+
dq 0x0000000000001000
493+
text_phdr:
494+
dd 0x00000001
495+
dd 0x00000005
496+
dq text_segment_offset
497+
dq text_segment_start
498+
dq text_segment_start
499+
dq text_segment_size
500+
dq text_segment_size
501+
dq 0x0000000000001000
502+
data_phdr:
503+
dd 0x00000001
504+
dd 0x00000006
505+
dq data_segment_offset
506+
dq data_segment_start
507+
dq data_segment_start
508+
dq data_segment_size
509+
dq data_segment_size
510+
dq 0x0000000000001000
511+
512+
align 4096, db 0
513+
514+
)";
515+
516+
std::string footer = R"(
517+
ehdrsize equ phdr - ehdr
518+
phdrsize equ text_phdr - phdr
519+
e_phoff equ phdr - ehdr
520+
header_segment_offset equ ehdr - ehdr
521+
header_segment_start equ ehdr
522+
header_segment_size equ text_segment_start - ehdr
523+
text_segment_offset equ text_segment_start - ehdr
524+
text_segment_size equ text_segment_end - text_segment_start
525+
data_segment_offset equ data_segment_start - ehdr
526+
data_segment_size equ data_segment_end - data_segment_start
527+
)";
528+
return header + m_asm_code + footer;
451529
}
452530

453531
// Saves the generated assembly into a file

0 commit comments

Comments
 (0)