summaryrefslogtreecommitdiff
path: root/src/tools/wasm-link.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/wasm-link.cc')
-rw-r--r--src/tools/wasm-link.cc354
1 files changed, 179 insertions, 175 deletions
diff --git a/src/tools/wasm-link.cc b/src/tools/wasm-link.cc
index 95506459..577dff45 100644
--- a/src/tools/wasm-link.cc
+++ b/src/tools/wasm-link.cc
@@ -21,10 +21,12 @@
#include "binary-writer.h"
#include "option-parser.h"
#include "stream.h"
-#include "vector.h"
#include "writer.h"
#include "binary-reader-linker.h"
+#include <memory>
+#include <vector>
+
#define PROGRAM_NAME "wasm-link"
#define NOPE HasArgument::No
#define YEP HasArgument::Yes
@@ -50,20 +52,22 @@ static Option s_options[] = {
};
WABT_STATIC_ASSERT(NUM_FLAGS == WABT_ARRAY_SIZE(s_options));
-typedef const char* String;
-WABT_DEFINE_VECTOR(string, String);
-
static bool s_debug;
static bool s_relocatable;
static const char* s_outfile = "a.wasm";
-static StringVector s_infiles;
+static std::vector<std::string> s_infiles;
static FileWriter s_log_stream_writer;
static Stream s_log_stream;
struct Context {
+ WABT_DISALLOW_COPY_AND_ASSIGN(Context);
+ Context() {
+ WABT_ZERO_MEMORY(stream);
+ }
+
Stream stream;
- LinkerInputBinaryVector inputs;
- ssize_t current_section_payload_offset;
+ std::vector<std::unique_ptr<LinkerInputBinary>> inputs;
+ ssize_t current_section_payload_offset = 0;
};
static void on_option(struct OptionParser* parser,
@@ -92,7 +96,7 @@ static void on_option(struct OptionParser* parser,
}
static void on_argument(struct OptionParser* parser, const char* argument) {
- append_string_value(&s_infiles, &argument);
+ s_infiles.emplace_back(argument);
}
static void on_option_error(struct OptionParser* parser, const char* message) {
@@ -110,43 +114,59 @@ static void parse_options(int argc, char** argv) {
parser.on_error = on_option_error;
parse_options(&parser, argc, argv);
- if (!s_infiles.size) {
+ if (!s_infiles.size()) {
print_help(&parser, PROGRAM_NAME);
WABT_FATAL("No inputs files specified.\n");
}
}
-void destroy_section(Section* section) {
- destroy_reloc_vector(&section->relocations);
- switch (section->section_code) {
- case BinarySection::Data:
- destroy_data_segment_vector(&section->data_segments);
- break;
- default:
- break;
+Section::Section()
+ : binary(nullptr),
+ section_code(BinarySection::Invalid),
+ size(0),
+ offset(0),
+ payload_size(0),
+ payload_offset(0),
+ count(0),
+ output_payload_offset(0) {}
+
+Section::~Section() {
+ if (section_code == BinarySection::Data) {
+ delete data_segments;
}
}
-void destroy_binary(LinkerInputBinary* binary) {
- WABT_DESTROY_VECTOR_AND_ELEMENTS(binary->sections, section);
- destroy_function_import_vector(&binary->function_imports);
- destroy_global_import_vector(&binary->global_imports);
- destroy_string_slice_vector(&binary->debug_names);
- destroy_export_vector(&binary->exports);
- delete[] binary->data;
+LinkerInputBinary::LinkerInputBinary(const char* filename,
+ uint8_t* data,
+ size_t size)
+ : filename(filename),
+ data(data),
+ size(size),
+ active_function_imports(0),
+ active_global_imports(0),
+ type_index_offset(0),
+ function_index_offset(0),
+ imported_function_index_offset(0),
+ table_index_offset(0),
+ memory_page_count(0),
+ memory_page_offset(0),
+ table_elem_count(0) {}
+
+LinkerInputBinary::~LinkerInputBinary() {
+ delete[] data;
}
static uint32_t relocate_func_index(LinkerInputBinary* binary,
uint32_t function_index) {
uint32_t offset;
- if (function_index >= binary->function_imports.size) {
+ if (function_index >= binary->function_imports.size()) {
/* locally declared function call */
offset = binary->function_index_offset;
if (s_debug)
writef(&s_log_stream, "func reloc %d + %d\n", function_index, offset);
} else {
/* imported function call */
- FunctionImport* import = &binary->function_imports.data[function_index];
+ FunctionImport* import = &binary->function_imports[function_index];
offset = binary->imported_function_index_offset;
if (!import->active) {
function_index = import->foreign_index;
@@ -181,7 +201,7 @@ static void apply_relocation(Section* section, Reloc* r) {
new_value = cur_value + offset;
break;
case RelocType::GlobalIndexLEB:
- if (cur_value >= binary->global_imports.size) {
+ if (cur_value >= binary->global_imports.size()) {
offset = binary->global_index_offset;
} else {
offset = binary->imported_global_index_offset;
@@ -199,7 +219,7 @@ static void apply_relocation(Section* section, Reloc* r) {
}
static void apply_relocations(Section* section) {
- if (!section->relocations.size)
+ if (!section->relocations.size())
return;
if (s_debug)
@@ -207,9 +227,8 @@ static void apply_relocations(Section* section) {
get_section_name(section->section_code));
/* Perform relocations in-place */
- for (size_t i = 0; i < section->relocations.size; i++) {
- Reloc* reloc = &section->relocations.data[i];
- apply_relocation(section, reloc);
+ for (Reloc& reloc: section->relocations) {
+ apply_relocation(section, &reloc);
}
}
@@ -231,6 +250,12 @@ static void write_slice(Stream* stream, StringSlice str, const char* desc) {
write_str(stream, str.start, str.length, PrintChars::Yes, desc);
}
+static void write_string(Stream* stream,
+ const std::string& str,
+ const char* desc) {
+ write_str(stream, str.data(), str.length(), PrintChars::Yes, desc);
+}
+
#define WRITE_UNKNOWN_SIZE(STREAM) \
{ \
uint32_t fixup_offset = (STREAM)->offset; \
@@ -244,16 +269,15 @@ static void write_slice(Stream* stream, StringSlice str, const char* desc) {
}
static void write_table_section(Context* ctx,
- const SectionPtrVector* sections) {
+ const SectionPtrVector& sections) {
/* Total section size includes the element count leb128 which is
* always 1 in the current spec */
uint32_t table_count = 1;
uint32_t flags = WABT_BINARY_LIMITS_HAS_MAX_FLAG;
uint32_t elem_count = 0;
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
- elem_count += sec->binary->table_elem_count;
+ for (Section* section: sections) {
+ elem_count += section->binary->table_elem_count;
}
Stream* stream = &ctx->stream;
@@ -268,29 +292,26 @@ static void write_table_section(Context* ctx,
static void write_export_section(Context* ctx) {
uint32_t total_exports = 0;
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- total_exports += binary->exports.size;
+ for (const std::unique_ptr<LinkerInputBinary>& binary: ctx->inputs) {
+ total_exports += binary->exports.size();
}
Stream* stream = &ctx->stream;
WRITE_UNKNOWN_SIZE(stream);
write_u32_leb128(stream, total_exports, "export count");
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- for (size_t j = 0; j < binary->exports.size; j++) {
- Export* export_ = &binary->exports.data[j];
- write_slice(stream, export_->name, "export name");
- write_u8_enum(stream, export_->kind, "export kind");
- uint32_t index = export_->index;
- switch (export_->kind) {
+ for (const std::unique_ptr<LinkerInputBinary>& binary : ctx->inputs) {
+ for (const Export& export_ : binary->exports) {
+ write_slice(stream, export_.name, "export name");
+ write_u8_enum(stream, export_.kind, "export kind");
+ uint32_t index = export_.index;
+ switch (export_.kind) {
case ExternalKind::Func:
- index = relocate_func_index(binary, index);
+ index = relocate_func_index(binary.get(), index);
break;
default:
WABT_FATAL("unsupport export type: %d\n",
- static_cast<int>(export_->kind));
+ static_cast<int>(export_.kind));
break;
}
write_u32_leb128(stream, index, "export index");
@@ -299,14 +320,14 @@ static void write_export_section(Context* ctx) {
FIXUP_SIZE(stream);
}
-static void write_elem_section(Context* ctx, const SectionPtrVector* sections) {
+static void write_elem_section(Context* ctx,
+ const SectionPtrVector& sections) {
Stream* stream = &ctx->stream;
WRITE_UNKNOWN_SIZE(stream);
uint32_t total_elem_count = 0;
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
- total_elem_count += sec->binary->table_elem_count;
+ for (Section* section : sections) {
+ total_elem_count += section->binary->table_elem_count;
}
write_u32_leb128(stream, 1, "segment count");
@@ -318,17 +339,16 @@ static void write_elem_section(Context* ctx, const SectionPtrVector* sections) {
ctx->current_section_payload_offset = stream->offset;
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
- apply_relocations(sec);
- write_section_payload(ctx, sec);
+ for (Section* section : sections) {
+ apply_relocations(section);
+ write_section_payload(ctx, section);
}
FIXUP_SIZE(stream);
}
static void write_memory_section(Context* ctx,
- const SectionPtrVector* sections) {
+ const SectionPtrVector& sections) {
Stream* stream = &ctx->stream;
WRITE_UNKNOWN_SIZE(stream);
@@ -337,8 +357,8 @@ static void write_memory_section(Context* ctx,
Limits limits;
WABT_ZERO_MEMORY(limits);
limits.has_max = true;
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
+ for (size_t i = 0; i < sections.size(); i++) {
+ Section* sec = sections[i];
limits.initial += sec->memory_limits.initial;
}
limits.max = limits.initial;
@@ -367,32 +387,32 @@ static void write_global_import(Context* ctx, GlobalImport* import) {
static void write_import_section(Context* ctx) {
uint32_t num_imports = 0;
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- FunctionImportVector* imports = &binary->function_imports;
- for (size_t j = 0; j < imports->size; j++) {
- FunctionImport* import = &imports->data[j];
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
+ std::vector<FunctionImport>& imports = binary->function_imports;
+ for (size_t j = 0; j < imports.size(); j++) {
+ FunctionImport* import = &imports[j];
if (import->active)
num_imports++;
}
- num_imports += binary->global_imports.size;
+ num_imports += binary->global_imports.size();
}
WRITE_UNKNOWN_SIZE(&ctx->stream);
write_u32_leb128(&ctx->stream, num_imports, "num imports");
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- FunctionImportVector* imports = &binary->function_imports;
- for (size_t j = 0; j < imports->size; j++) {
- FunctionImport* import = &imports->data[j];
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
+ std::vector<FunctionImport>& imports = binary->function_imports;
+ for (size_t j = 0; j < imports.size(); j++) {
+ FunctionImport* import = &imports[j];
if (import->active)
write_function_import(ctx, import, binary->type_index_offset);
}
- GlobalImportVector* globals = &binary->global_imports;
- for (size_t j = 0; j < globals->size; j++) {
- write_global_import(ctx, &globals->data[j]);
+ std::vector<GlobalImport>& globals = binary->global_imports;
+ for (size_t j = 0; j < globals.size(); j++) {
+ write_global_import(ctx, &globals[j]);
}
}
@@ -400,15 +420,15 @@ static void write_import_section(Context* ctx) {
}
static void write_function_section(Context* ctx,
- const SectionPtrVector* sections,
+ const SectionPtrVector& sections,
uint32_t total_count) {
Stream* stream = &ctx->stream;
WRITE_UNKNOWN_SIZE(stream);
write_u32_leb128(stream, total_count, "function count");
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
+ for (size_t i = 0; i < sections.size(); i++) {
+ Section* sec = sections[i];
uint32_t count = sec->count;
uint32_t input_offset = 0;
uint32_t sig_index = 0;
@@ -426,28 +446,28 @@ static void write_function_section(Context* ctx,
}
static void write_data_segment(Stream* stream,
- DataSegment* segment,
+ const DataSegment& segment,
uint32_t offset) {
- assert(segment->memory_index == 0);
- write_u32_leb128(stream, segment->memory_index, "memory index");
+ assert(segment.memory_index == 0);
+ write_u32_leb128(stream, segment.memory_index, "memory index");
write_opcode(stream, Opcode::I32Const);
- write_u32_leb128(stream, segment->offset + offset, "offset");
+ write_u32_leb128(stream, segment.offset + offset, "offset");
write_opcode(stream, Opcode::End);
- write_u32_leb128(stream, segment->size, "segment size");
- write_data(stream, segment->data, segment->size, "segment data");
+ write_u32_leb128(stream, segment.size, "segment size");
+ write_data(stream, segment.data, segment.size, "segment data");
}
static void write_data_section(Context* ctx,
- SectionPtrVector* sections,
+ const SectionPtrVector& sections,
uint32_t total_count) {
Stream* stream = &ctx->stream;
WRITE_UNKNOWN_SIZE(stream);
write_u32_leb128(stream, total_count, "data segment count");
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
- for (size_t j = 0; j < sec->data_segments.size; j++) {
- DataSegment* segment = &sec->data_segments.data[j];
+ for (size_t i = 0; i < sections.size(); i++) {
+ Section* sec = sections[i];
+ for (size_t j = 0; j < sec->data_segments->size(); j++) {
+ const DataSegment& segment = (*sec->data_segments)[j];
write_data_segment(stream, segment,
sec->binary->memory_page_offset * WABT_PAGE_SIZE);
}
@@ -459,11 +479,11 @@ static void write_data_section(Context* ctx,
static void write_names_section(Context* ctx) {
uint32_t total_count = 0;
size_t k;
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- for (size_t j = 0; j < binary->debug_names.size; j++) {
- if (j < binary->function_imports.size) {
- if (!binary->function_imports.data[j].active)
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
+ for (size_t j = 0; j < binary->debug_names.size(); j++) {
+ if (j < binary->function_imports.size()) {
+ if (!binary->function_imports[j].active)
continue;
}
total_count++;
@@ -482,15 +502,15 @@ static void write_names_section(Context* ctx) {
write_u32_leb128(stream, total_count, "element count");
k = 0;
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- for (size_t j = 0; j < binary->debug_names.size; j++) {
- if (j < binary->function_imports.size) {
- if (!binary->function_imports.data[j].active)
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
+ for (size_t j = 0; j < binary->debug_names.size(); j++) {
+ if (j < binary->function_imports.size()) {
+ if (!binary->function_imports[j].active)
continue;
}
write_u32_leb128(stream, k++, "function index");
- write_slice(stream, binary->debug_names.data[j], "function name");
+ write_string(stream, binary->debug_names[j], "function name");
}
}
@@ -500,13 +520,13 @@ static void write_names_section(Context* ctx) {
static void write_reloc_section(Context* ctx,
BinarySection section_code,
- SectionPtrVector* sections) {
+ const SectionPtrVector& sections) {
uint32_t total_relocs = 0;
/* First pass to know total reloc count */
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
- total_relocs += sec->relocations.size;
+ for (size_t i = 0; i < sections.size(); i++) {
+ Section* sec = sections[i];
+ total_relocs += sec->relocations.size();
}
if (!total_relocs)
@@ -523,14 +543,14 @@ static void write_reloc_section(Context* ctx,
write_u32_leb128_enum(&ctx->stream, section_code, "reloc section");
write_u32_leb128(&ctx->stream, total_relocs, "num relocs");
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
- RelocVector* relocs = &sec->relocations;
- for (size_t j = 0; j < relocs->size; j++) {
- write_u32_leb128_enum(&ctx->stream, relocs->data[j].type, "reloc type");
- uint32_t new_offset = relocs->data[j].offset + sec->output_payload_offset;
+ for (size_t i = 0; i < sections.size(); i++) {
+ Section* sec = sections[i];
+ const std::vector<Reloc>& relocs = sec->relocations;
+ for (size_t j = 0; j < relocs.size(); j++) {
+ write_u32_leb128_enum(&ctx->stream, relocs[j].type, "reloc type");
+ uint32_t new_offset = relocs[j].offset + sec->output_payload_offset;
write_u32_leb128(&ctx->stream, new_offset, "reloc offset");
- write_u32_leb128(&ctx->stream, relocs->data[j].index, "reloc index");
+ write_u32_leb128(&ctx->stream, relocs[j].index, "reloc index");
}
}
@@ -539,11 +559,11 @@ static void write_reloc_section(Context* ctx,
static bool write_combined_section(Context* ctx,
BinarySection section_code,
- SectionPtrVector* sections) {
- if (!sections->size)
+ const SectionPtrVector& sections) {
+ if (!sections.size())
return false;
- if (section_code == BinarySection::Start && sections->size > 1) {
+ if (section_code == BinarySection::Start && sections.size() > 1) {
WABT_FATAL("Don't know how to combine sections of type: %s\n",
get_section_name(section_code));
}
@@ -552,8 +572,8 @@ static bool write_combined_section(Context* ctx,
uint32_t total_size = 0;
/* Sum section size and element count */
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
+ for (size_t i = 0; i < sections.size(); i++) {
+ Section* sec = sections[i];
total_size += sec->payload_size;
total_count += sec->count;
}
@@ -592,8 +612,8 @@ static bool write_combined_section(Context* ctx,
write_u32_leb128(stream, total_size, "section size");
write_u32_leb128(stream, total_count, "element count");
ctx->current_section_payload_offset = ctx->stream.offset;
- for (size_t i = 0; i < sections->size; i++) {
- Section* sec = sections->data[i];
+ for (size_t i = 0; i < sections.size(); i++) {
+ Section* sec = sections[i];
apply_relocations(sec);
write_section_payload(ctx, sec);
}
@@ -604,28 +624,27 @@ static bool write_combined_section(Context* ctx,
}
struct ExportInfo {
+ ExportInfo(Export* export_, LinkerInputBinary* binary)
+ : export_(export_), binary(binary) {}
+
Export* export_;
LinkerInputBinary* binary;
};
-WABT_DEFINE_VECTOR(export_info, ExportInfo);
static void resolve_symbols(Context* ctx) {
/* Create hashmap of all exported symbols from all inputs */
BindingHash export_map;
- ExportInfoVector export_list;
- WABT_ZERO_MEMORY(export_list);
+ std::vector<ExportInfo> export_list;
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- for (size_t j = 0; j < binary->exports.size; j++) {
- Export* export_ = &binary->exports.data[j];
- ExportInfo* info = append_export_info(&export_list);
- info->export_ = export_;
- info->binary = binary;
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
+ for (size_t j = 0; j < binary->exports.size(); j++) {
+ Export* export_ = &binary->exports[j];
+ export_list.emplace_back(export_, binary);
/* TODO(sbc): Handle duplicate names */
export_map.emplace(string_slice_to_string(export_->name),
- Binding(export_list.size - 1));
+ Binding(export_list.size() - 1));
}
}
@@ -633,10 +652,10 @@ static void resolve_symbols(Context* ctx) {
* Iterate through all imported functions resolving them against exported
* ones.
*/
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
- for (size_t j = 0; j < binary->function_imports.size; j++) {
- FunctionImport* import = &binary->function_imports.data[j];
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
+ for (size_t j = 0; j < binary->function_imports.size(); j++) {
+ FunctionImport* import = &binary->function_imports[j];
int export_index = export_map.find_index(import->name);
if (export_index == -1) {
if (!s_relocatable)
@@ -646,7 +665,7 @@ static void resolve_symbols(Context* ctx) {
}
/* We found the symbol exported by another module */
- ExportInfo* export_info = &export_list.data[export_index];
+ ExportInfo* export_info = &export_list[export_index];
/* TODO(sbc): verify the foriegn function has the correct signature */
import->active = false;
@@ -655,8 +674,6 @@ static void resolve_symbols(Context* ctx) {
binary->active_function_imports--;
}
}
-
- destroy_export_info_vector(&export_list);
}
static void calculate_reloc_offsets(Context* ctx) {
@@ -667,8 +684,8 @@ static void calculate_reloc_offsets(Context* ctx) {
uint32_t table_elem_count = 0;
uint32_t total_function_imports = 0;
uint32_t total_global_imports = 0;
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
/* The imported_function_index_offset is the sum of all the function
* imports from objects that precede this one. i.e. the current running
* total */
@@ -677,15 +694,15 @@ static void calculate_reloc_offsets(Context* ctx) {
binary->memory_page_offset = memory_page_offset;
memory_page_offset += binary->memory_page_count;
total_function_imports += binary->active_function_imports;
- total_global_imports += binary->global_imports.size;
+ total_global_imports += binary->global_imports.size();
}
- for (size_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
+ for (size_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
binary->table_index_offset = table_elem_count;
table_elem_count += binary->table_elem_count;
- for (size_t j = 0; j < binary->sections.size; j++) {
- Section* sec = &binary->sections.data[j];
+ for (size_t j = 0; j < binary->sections.size(); j++) {
+ Section* sec = binary->sections[j].get();
switch (sec->section_code) {
case BinarySection::Type:
binary->type_index_offset = type_count;
@@ -693,13 +710,13 @@ static void calculate_reloc_offsets(Context* ctx) {
break;
case BinarySection::Global:
binary->global_index_offset = total_global_imports -
- sec->binary->global_imports.size +
+ sec->binary->global_imports.size() +
global_count;
global_count += sec->count;
break;
case BinarySection::Function:
binary->function_index_offset = total_function_imports -
- sec->binary->function_imports.size +
+ sec->binary->function_imports.size() +
function_count;
function_count += sec->count;
break;
@@ -713,14 +730,13 @@ static void calculate_reloc_offsets(Context* ctx) {
static void write_binary(Context* ctx) {
/* Find all the sections of each type */
SectionPtrVector sections[kBinarySectionCount];
- WABT_ZERO_MEMORY(sections);
-
- for (size_t j = 0; j < ctx->inputs.size; j++) {
- LinkerInputBinary* binary = &ctx->inputs.data[j];
- for (size_t i = 0; i < binary->sections.size; i++) {
- Section* s = &binary->sections.data[i];
- SectionPtrVector* sec_list = &sections[static_cast<int>(s->section_code)];
- append_section_ptr_value(sec_list, &s);
+
+ for (size_t j = 0; j < ctx->inputs.size(); j++) {
+ LinkerInputBinary* binary = ctx->inputs[j].get();
+ for (size_t i = 0; i < binary->sections.size(); i++) {
+ Section* s = binary->sections[i].get();
+ SectionPtrVector& sec_list = sections[static_cast<int>(s->section_code)];
+ sec_list.push_back(s);
}
}
@@ -730,25 +746,21 @@ static void write_binary(Context* ctx) {
/* Write known sections first */
for (size_t i = FIRST_KNOWN_SECTION; i < kBinarySectionCount; i++) {
- write_combined_section(ctx, static_cast<BinarySection>(i), &sections[i]);
+ write_combined_section(ctx, static_cast<BinarySection>(i), sections[i]);
}
write_names_section(ctx);
/* Generate a new set of reloction sections */
for (size_t i = FIRST_KNOWN_SECTION; i < kBinarySectionCount; i++) {
- write_reloc_section(ctx, static_cast<BinarySection>(i), &sections[i]);
- }
-
- for (size_t i = 0; i < kBinarySectionCount; i++) {
- destroy_section_ptr_vector(&sections[i]);
+ write_reloc_section(ctx, static_cast<BinarySection>(i), sections[i]);
}
}
static void dump_reloc_offsets(Context* ctx) {
if (s_debug) {
- for (uint32_t i = 0; i < ctx->inputs.size; i++) {
- LinkerInputBinary* binary = &ctx->inputs.data[i];
+ for (uint32_t i = 0; i < ctx->inputs.size(); i++) {
+ LinkerInputBinary* binary = ctx->inputs[i].get();
writef(&s_log_stream, "Relocation info for: %s\n", binary->filename);
writef(&s_log_stream, " - type index offset : %d\n",
binary->type_index_offset);
@@ -797,38 +809,30 @@ int main(int argc, char** argv) {
init_stdio();
Context context;
- WABT_ZERO_MEMORY(context);
parse_options(argc, argv);
Result result = Result::Ok;
- for (size_t i = 0; i < s_infiles.size; i++) {
- const char* input_filename = s_infiles.data[i];
+ for (size_t i = 0; i < s_infiles.size(); i++) {
+ const std::string& input_filename = s_infiles[i];
if (s_debug)
- writef(&s_log_stream, "reading file: %s\n", input_filename);
+ writef(&s_log_stream, "reading file: %s\n", input_filename.c_str());
char* data;
size_t size;
- result = read_file(input_filename, &data, &size);
+ result = read_file(input_filename.c_str(), &data, &size);
if (WABT_FAILED(result))
return result != Result::Ok;
- LinkerInputBinary* b = append_binary(&context.inputs);
- b->data = reinterpret_cast<uint8_t*>(data);
- b->size = size;
- b->filename = input_filename;
+ LinkerInputBinary* b = new LinkerInputBinary(
+ input_filename.c_str(), reinterpret_cast<uint8_t*>(data), size);
+ context.inputs.emplace_back(b);
LinkOptions options = { NULL };
if (s_debug)
options.log_stream = &s_log_stream;
result = read_binary_linker(b, &options);
if (WABT_FAILED(result))
- WABT_FATAL("error parsing file: %s\n", input_filename);
+ WABT_FATAL("error parsing file: %s\n", input_filename.c_str());
}
result = perform_link(&context);
- if (WABT_FAILED(result))
- return result != Result::Ok;
-
- /* Cleanup */
- WABT_DESTROY_VECTOR_AND_ELEMENTS(context.inputs, binary);
- destroy_string_vector(&s_infiles);
return result != Result::Ok;
}