[WebAssembly] Export some more info on wasm funtions

Summary:
These fields are useful for lld's gc-sections support

Also remove an unused field.

Subscribers: jfb, dschuff, jgravelle-google, aheejin, sunfish

Differential Revision: https://reviews.llvm.org/D41320

llvm-svn: 320946
This commit is contained in:
Sam Clegg 2017-12-17 17:50:07 +00:00
parent 6f7bbf349f
commit c551522d25
3 changed files with 9 additions and 6 deletions

View File

@ -91,6 +91,8 @@ struct WasmLocalDecl {
struct WasmFunction { struct WasmFunction {
std::vector<WasmLocalDecl> Locals; std::vector<WasmLocalDecl> Locals;
ArrayRef<uint8_t> Body; ArrayRef<uint8_t> Body;
size_t CodeSectionOffset;
size_t Size;
}; };
struct WasmDataSegment { struct WasmDataSegment {

View File

@ -140,7 +140,6 @@ public:
ArrayRef<wasm::WasmElemSegment> elements() const { return ElemSegments; } ArrayRef<wasm::WasmElemSegment> elements() const { return ElemSegments; }
ArrayRef<WasmSegment> dataSegments() const { return DataSegments; } ArrayRef<WasmSegment> dataSegments() const { return DataSegments; }
ArrayRef<wasm::WasmFunction> functions() const { return Functions; } ArrayRef<wasm::WasmFunction> functions() const { return Functions; }
const ArrayRef<uint8_t>& code() const { return CodeSection; }
uint32_t startFunction() const { return StartFunction; } uint32_t startFunction() const { return StartFunction; }
void moveSymbolNext(DataRefImpl &Symb) const override; void moveSymbolNext(DataRefImpl &Symb) const override;
@ -242,7 +241,6 @@ private:
std::vector<WasmSegment> DataSegments; std::vector<WasmSegment> DataSegments;
std::vector<wasm::WasmFunction> Functions; std::vector<wasm::WasmFunction> Functions;
std::vector<WasmSymbol> Symbols; std::vector<WasmSymbol> Symbols;
ArrayRef<uint8_t> CodeSection;
uint32_t StartFunction = -1; uint32_t StartFunction = -1;
bool HasLinkingSection = false; bool HasLinkingSection = false;
wasm::WasmLinkingData LinkingData; wasm::WasmLinkingData LinkingData;

View File

@ -684,18 +684,21 @@ Error WasmObjectFile::parseStartSection(const uint8_t *Ptr, const uint8_t *End)
} }
Error WasmObjectFile::parseCodeSection(const uint8_t *Ptr, const uint8_t *End) { Error WasmObjectFile::parseCodeSection(const uint8_t *Ptr, const uint8_t *End) {
const uint8_t *CodeSectionStart = Ptr;
uint32_t FunctionCount = readVaruint32(Ptr); uint32_t FunctionCount = readVaruint32(Ptr);
if (FunctionCount != FunctionTypes.size()) { if (FunctionCount != FunctionTypes.size()) {
return make_error<GenericBinaryError>("Invalid function count", return make_error<GenericBinaryError>("Invalid function count",
object_error::parse_failed); object_error::parse_failed);
} }
CodeSection = ArrayRef<uint8_t>(Ptr, End - Ptr);
while (FunctionCount--) { while (FunctionCount--) {
wasm::WasmFunction Function; wasm::WasmFunction Function;
uint32_t FunctionSize = readVaruint32(Ptr); const uint8_t *FunctionStart = Ptr;
const uint8_t *FunctionEnd = Ptr + FunctionSize; uint32_t Size = readVaruint32(Ptr);
const uint8_t *FunctionEnd = Ptr + Size;
Function.CodeSectionOffset = FunctionStart - CodeSectionStart;
Function.Size = FunctionEnd - FunctionStart;
uint32_t NumLocalDecls = readVaruint32(Ptr); uint32_t NumLocalDecls = readVaruint32(Ptr);
Function.Locals.reserve(NumLocalDecls); Function.Locals.reserve(NumLocalDecls);