Files
sdk/runtime/vm/elf.h
T
Liam Appelbe 4d62935fe5 [vm] Fix a small ELF serialization issue for simarm_x64
Bug: https://github.com/dart-lang/sdk/issues/36839
Change-Id: I6b7748c12cf35b16b733ebe7984c4968364a8bdf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/110132
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Liam Appelbe <liama@google.com>
2019-07-23 22:18:42 +00:00

87 lines
2.4 KiB
C++

// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef RUNTIME_VM_ELF_H_
#define RUNTIME_VM_ELF_H_
#include "vm/allocation.h"
#include "vm/compiler/runtime_api.h"
#include "vm/datastream.h"
#include "vm/growable_array.h"
#include "vm/zone.h"
namespace dart {
class DynamicTable;
class Section;
class StringTable;
class Symbol;
class SymbolTable;
class Elf : public ZoneAllocated {
public:
Elf(Zone* zone, StreamingWriteStream* stream);
intptr_t NextMemoryOffset();
intptr_t AddText(const char* name, const uint8_t* bytes, intptr_t size);
intptr_t AddROData(const char* name, const uint8_t* bytes, intptr_t size);
void AddDebug(const char* name, const uint8_t* bytes, intptr_t size);
void Finalize();
intptr_t position() const { return stream_->position(); }
void WriteBytes(const uint8_t* b, intptr_t size) {
stream_->WriteBytes(b, size);
}
void WriteByte(uint8_t value) {
stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
}
void WriteHalf(uint16_t value) {
stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
}
void WriteWord(uint32_t value) {
stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
}
void WriteAddr(compiler::target::uword value) {
stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
}
void WriteOff(compiler::target::uword value) {
stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
}
#if defined(TARGET_ARCH_IS_64_BIT)
void WriteXWord(uint64_t value) {
stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
}
#endif
private:
void AddSection(Section* section);
void AddSegment(Section* section);
void ComputeFileOffsets();
void WriteHeader();
void WriteSectionTable();
void WriteProgramTable();
void WriteSections();
Zone* const zone_;
StreamingWriteStream* stream_;
GrowableArray<Section*> sections_;
GrowableArray<Section*> segments_;
intptr_t memory_offset_;
intptr_t section_table_file_offset_;
intptr_t section_table_file_size_;
intptr_t program_table_file_offset_;
intptr_t program_table_file_size_;
StringTable* shstrtab_;
StringTable* symstrtab_;
SymbolTable* symtab_;
DynamicTable* dynamic_;
};
} // namespace dart
#endif // RUNTIME_VM_ELF_H_