Skip to content

Commit ca76842

Browse files
committed
WASM_X64: Define and use common get_seg_header()
1 parent 6f6614f commit ca76842

File tree

1 file changed

+11
-34
lines changed

1 file changed

+11
-34
lines changed

src/libasr/codegen/x86_assembler.cpp

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -378,38 +378,13 @@ Elf64_Ehdr get_elf_header(uint64_t asm_entry) {
378378
return e;
379379
}
380380

381-
Elf64_Phdr get_program_header(uint64_t addr_origin, uint64_t seg_size) {
381+
Elf64_Phdr get_seg_header(uint32_t flags, uint64_t origin_addr,
382+
uint64_t seg_size, uint64_t prev_seg_offset, uint64_t prev_seg_size) {
382383
Elf64_Phdr p;
383384
p.type = 1;
384-
p.flags = 4;
385-
p.offset = 0;
386-
p.vaddr = addr_origin;
387-
p.paddr = p.vaddr;
388-
p.filesz = seg_size;
389-
p.memsz = p.filesz;
390-
p.align = 0x1000;
391-
return p;
392-
}
393-
394-
Elf64_Phdr get_text_segment(uint64_t addr_origin, uint64_t prev_seg_offset, uint64_t prev_seg_size, uint64_t seg_size) {
395-
Elf64_Phdr p;
396-
p.type = 1;
397-
p.flags = 5;
385+
p.flags = flags;
398386
p.offset = prev_seg_offset + prev_seg_size;
399-
p.vaddr = addr_origin + p.offset;
400-
p.paddr = p.vaddr;
401-
p.filesz = seg_size;
402-
p.memsz = p.filesz;
403-
p.align = 0x1000;
404-
return p;
405-
}
406-
407-
Elf64_Phdr get_data_segment(uint64_t addr_origin, uint64_t prev_seg_offset, uint64_t prev_seg_size, uint64_t seg_size) {
408-
Elf64_Phdr p;
409-
p.type = 1;
410-
p.flags = 6;
411-
p.offset = prev_seg_offset + prev_seg_size;
412-
p.vaddr = addr_origin + p.offset;
387+
p.vaddr = origin_addr + p.offset;
413388
p.paddr = p.vaddr;
414389
p.filesz = seg_size;
415390
p.memsz = p.filesz;
@@ -457,11 +432,13 @@ Vec<uint8_t> create_elf64_x86_binary(Allocator &al, X86Assembler &a) {
457432
uint64_t origin_addr = a.origin() - HEADER_SEGMENT_SIZE;
458433

459434
Elf64_Ehdr e = get_elf_header(a.get_defined_symbol("_start").value);
460-
Elf64_Phdr p_program = get_program_header(origin_addr, HEADER_SEGMENT_SIZE);
461-
Elf64_Phdr p_text_seg = get_text_segment(origin_addr, p_program.offset, p_program.filesz,
462-
a.get_defined_symbol("text_segment_end").value - a.get_defined_symbol("text_segment_start").value);
463-
Elf64_Phdr p_data_seg = get_data_segment(origin_addr, p_text_seg.offset, p_text_seg.filesz,
464-
a.get_defined_symbol("data_segment_end").value - a.get_defined_symbol("data_segment_start").value);
435+
Elf64_Phdr p_program = get_seg_header(4, origin_addr, HEADER_SEGMENT_SIZE, 0, 0);
436+
437+
const uint64_t text_seg_size = a.get_defined_symbol("text_segment_end").value - a.get_defined_symbol("text_segment_start").value;
438+
Elf64_Phdr p_text_seg = get_seg_header(5, origin_addr, text_seg_size, p_program.offset, p_program.filesz);
439+
440+
const uint64_t data_seg_size = a.get_defined_symbol("data_segment_end").value - a.get_defined_symbol("data_segment_start").value;
441+
Elf64_Phdr p_data_seg = get_seg_header(6, origin_addr, data_seg_size, p_text_seg.offset, p_text_seg.filesz);
465442

466443
Vec<uint8_t> bin;
467444
bin.reserve(al, HEADER_SEGMENT_SIZE);

0 commit comments

Comments
 (0)