Skip to content

Commit 0630d23

Browse files
committed
WASM_X64: Pass only required params to create_elf64_x86_header()
1 parent 14b1197 commit 0630d23

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

src/libasr/codegen/x86_assembler.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
namespace LCompilers {
1212

1313
void X86Assembler::save_binary64(const std::string &filename) {
14-
Vec<uint8_t> header = create_elf64_x86_header(m_al, *this);
14+
Vec<uint8_t> header = create_elf64_x86_header(
15+
m_al, origin(), get_defined_symbol("_start").value,
16+
compute_seg_size("text_segment_start", "text_segment_end"),
17+
compute_seg_size("data_segment_start", "data_segment_end"));
1518
{
1619
std::ofstream out;
1720
out.open(filename);
@@ -425,7 +428,8 @@ void align_by_byte(Allocator &al, Vec<uint8_t> &code, uint64_t alignment) {
425428
}
426429
}
427430

428-
Vec<uint8_t> create_elf64_x86_header(Allocator &al, X86Assembler &a) {
431+
Vec<uint8_t> create_elf64_x86_header(Allocator &al, uint64_t origin, uint64_t entry,
432+
uint64_t text_seg_size, uint64_t data_seg_size) {
429433

430434
/*
431435
The header segment is a segment which holds the elf and program headers.
@@ -445,15 +449,11 @@ Vec<uint8_t> create_elf64_x86_header(Allocator &al, X86Assembler &a) {
445449
const int HEADER_SEGMENT_SIZE = 0x1000;
446450

447451
// adjust/offset the origin address as per the extra bytes of HEADER_SEGMENT_SIZE
448-
uint64_t origin_addr = a.origin() - HEADER_SEGMENT_SIZE;
452+
uint64_t origin_addr = origin - HEADER_SEGMENT_SIZE;
449453

450-
Elf64_Ehdr e = get_elf_header(a.get_defined_symbol("_start").value);
454+
Elf64_Ehdr e = get_elf_header(entry);
451455
Elf64_Phdr p_program = get_seg_header(4, origin_addr, HEADER_SEGMENT_SIZE, 0, 0);
452-
453-
const uint64_t text_seg_size = a.get_defined_symbol("text_segment_end").value - a.get_defined_symbol("text_segment_start").value;
454456
Elf64_Phdr p_text_seg = get_seg_header(5, origin_addr, text_seg_size, p_program.offset, p_program.filesz);
455-
456-
const uint64_t data_seg_size = a.get_defined_symbol("data_segment_end").value - a.get_defined_symbol("data_segment_start").value;
457457
Elf64_Phdr p_data_seg = get_seg_header(6, origin_addr, data_seg_size, p_text_seg.offset, p_text_seg.filesz);
458458

459459
Vec<uint8_t> header;

src/libasr/codegen/x86_assembler.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,10 @@ R"(BITS 64
554554
EMIT("\n\talign " + std::to_string(alignment) + ", db 0");
555555
}
556556

557+
uint64_t compute_seg_size(std::string start_flag, std::string end_flag) {
558+
return get_defined_symbol(end_flag).value - get_defined_symbol(start_flag).value;
559+
}
560+
557561
void define_symbol(const std::string &name, uint32_t value) {
558562
if (m_symbols.find(name) == m_symbols.end()) {
559563
Symbol s;
@@ -1627,7 +1631,8 @@ void emit_print_float(X86Assembler &a, const std::string &name);
16271631
template <typename T>
16281632
void append_header_bytes(Allocator &al, T src, Vec<uint8_t> &des);
16291633
void align_by_byte(Allocator &al, Vec<uint8_t> &code, uint64_t alignment);
1630-
Vec<uint8_t> create_elf64_x86_header(Allocator &al, X86Assembler &a);
1634+
Vec<uint8_t> create_elf64_x86_header(Allocator &al, uint64_t origin, uint64_t entry,
1635+
uint64_t text_seg_size, uint64_t data_seg_size);
16311636

16321637
void emit_print_64(X86Assembler &a, const std::string &msg_label, uint64_t size);
16331638
void emit_print_int_64(X86Assembler &a, const std::string &name);

0 commit comments

Comments
 (0)