[llvm] r320742 - [WebAssembly] Add support for init functions linking metadata
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 14 13:10:03 PST 2017
Author: sbc
Date: Thu Dec 14 13:10:03 2017
New Revision: 320742
URL: http://llvm.org/viewvc/llvm-project?rev=320742&view=rev
Log:
[WebAssembly] Add support for init functions linking metadata
Summary:
This change lays the groundwork lowering of @llvm.global_ctors
and @llvm.global_dtors for the wasm object format. Some parts
of this patch are subset of: https://reviews.llvm.org/D40759
See https://github.com/WebAssembly/tool-conventions/issues/25
Subscribers: jfb, dschuff, jgravelle-google, aheejin, sunfish
Differential Revision: https://reviews.llvm.org/D41208
Modified:
llvm/trunk/include/llvm/BinaryFormat/Wasm.h
llvm/trunk/include/llvm/Object/Wasm.h
llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h
llvm/trunk/lib/Object/WasmObjectFile.cpp
llvm/trunk/lib/ObjectYAML/WasmYAML.cpp
llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml
llvm/trunk/tools/obj2yaml/wasm2yaml.cpp
llvm/trunk/tools/yaml2obj/yaml2wasm.cpp
Modified: llvm/trunk/include/llvm/BinaryFormat/Wasm.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BinaryFormat/Wasm.h?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/include/llvm/BinaryFormat/Wasm.h (original)
+++ llvm/trunk/include/llvm/BinaryFormat/Wasm.h Thu Dec 14 13:10:03 2017
@@ -115,8 +115,14 @@ struct WasmRelocation {
int64_t Addend; // A value to add to the symbol.
};
+struct WasmInitFunc {
+ uint32_t Priority;
+ uint32_t FunctionIndex;
+};
+
struct WasmLinkingData {
uint32_t DataSize;
+ std::vector<WasmInitFunc> InitFunctions;
};
enum : unsigned {
@@ -185,6 +191,7 @@ enum : unsigned {
WASM_SYMBOL_INFO = 0x2,
WASM_DATA_SIZE = 0x3,
WASM_SEGMENT_INFO = 0x5,
+ WASM_INIT_FUNCS = 0x6,
};
const unsigned WASM_SYMBOL_BINDING_MASK = 0x3;
Modified: llvm/trunk/include/llvm/Object/Wasm.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Wasm.h?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/Wasm.h (original)
+++ llvm/trunk/include/llvm/Object/Wasm.h Thu Dec 14 13:10:03 2017
@@ -206,6 +206,7 @@ public:
bool isRelocatableObject() const override;
private:
+ bool isValidFunctionIndex(uint32_t Index) const;
const WasmSection &getWasmSection(DataRefImpl Ref) const;
const wasm::WasmRelocation &getWasmRelocation(DataRefImpl Ref) const;
Modified: llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h Thu Dec 14 13:10:03 2017
@@ -131,6 +131,11 @@ struct SymbolInfo {
SymbolFlags Flags;
};
+struct InitFunction {
+ uint32_t Priority;
+ uint32_t FunctionIndex;
+};
+
struct Section {
explicit Section(SectionType SecType) : Type(SecType) {}
virtual ~Section();
@@ -173,6 +178,7 @@ struct LinkingSection : CustomSection {
uint32_t DataSize;
std::vector<SymbolInfo> SymbolInfos;
std::vector<SegmentInfo> SegmentInfos;
+ std::vector<InitFunction> InitFunctions;
};
struct TypeSection : Section {
@@ -309,6 +315,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmY
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::InitFunction)
namespace llvm {
namespace yaml {
@@ -401,6 +408,10 @@ template <> struct MappingTraits<WasmYAM
static void mapping(IO &IO, WasmYAML::SymbolInfo &Info);
};
+template <> struct MappingTraits<WasmYAML::InitFunction> {
+ static void mapping(IO &IO, WasmYAML::InitFunction &Init);
+};
+
template <> struct ScalarEnumerationTraits<WasmYAML::ValueType> {
static void enumeration(IO &IO, WasmYAML::ValueType &Type);
};
Modified: llvm/trunk/lib/Object/WasmObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/WasmObjectFile.cpp?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/lib/Object/WasmObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/WasmObjectFile.cpp Thu Dec 14 13:10:03 2017
@@ -398,6 +398,21 @@ Error WasmObjectFile::parseLinkingSectio
}
break;
}
+ case wasm::WASM_INIT_FUNCS: {
+ uint32_t Count = readVaruint32(Ptr);
+ LinkingData.InitFunctions.reserve(Count);
+ for (uint32_t i = 0; i < Count; i++) {
+ wasm::WasmInitFunc Init;
+ Init.Priority = readVaruint32(Ptr);
+ Init.FunctionIndex = readVaruint32(Ptr);
+ if (!isValidFunctionIndex(Init.FunctionIndex))
+ return make_error<GenericBinaryError>("Invalid function index: " +
+ Twine(Init.FunctionIndex),
+ object_error::parse_failed);
+ LinkingData.InitFunctions.emplace_back(Init);
+ }
+ break;
+ }
default:
Ptr += Size;
break;
@@ -656,9 +671,13 @@ Error WasmObjectFile::parseExportSection
return Error::success();
}
+bool WasmObjectFile::isValidFunctionIndex(uint32_t Index) const {
+ return Index < FunctionTypes.size() + NumImportedFunctions;
+}
+
Error WasmObjectFile::parseStartSection(const uint8_t *Ptr, const uint8_t *End) {
StartFunction = readVaruint32(Ptr);
- if (StartFunction >= FunctionTypes.size())
+ if (!isValidFunctionIndex(StartFunction))
return make_error<GenericBinaryError>("Invalid start function",
object_error::parse_failed);
return Error::success();
Modified: llvm/trunk/lib/ObjectYAML/WasmYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/WasmYAML.cpp?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/WasmYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/WasmYAML.cpp Thu Dec 14 13:10:03 2017
@@ -60,6 +60,7 @@ static void sectionMapping(IO &IO, WasmY
IO.mapRequired("DataSize", Section.DataSize);
IO.mapOptional("SymbolInfo", Section.SymbolInfos);
IO.mapOptional("SegmentInfo", Section.SegmentInfos);
+ IO.mapOptional("InitFunctions", Section.InitFunctions);
}
static void sectionMapping(IO &IO, WasmYAML::CustomSection &Section) {
@@ -359,6 +360,12 @@ void MappingTraits<WasmYAML::DataSegment
IO.mapRequired("Content", Segment.Content);
}
+void MappingTraits<WasmYAML::InitFunction>::mapping(
+ IO &IO, WasmYAML::InitFunction &Init) {
+ IO.mapRequired("Priority", Init.Priority);
+ IO.mapRequired("FunctionIndex", Init.FunctionIndex);
+}
+
void MappingTraits<WasmYAML::SymbolInfo>::mapping(IO &IO,
WasmYAML::SymbolInfo &Info) {
IO.mapRequired("Name", Info.Name);
Modified: llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml (original)
+++ llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml Thu Dec 14 13:10:03 2017
@@ -41,6 +41,9 @@ Sections:
Alignment: 2
Flags: [ ]
Name: moredata
+ InitFunctions:
+ - Priority: 1
+ FunctionIndex: 0
...
# CHECK: - Type: CUSTOM
# CHECK-NEXT: Name: linking
@@ -57,4 +60,7 @@ Sections:
# CHECK-NEXT: Name: moredata
# CHECK-NEXT: Alignment: 2
# CHECK-NEXT: Flags: [ ]
+# CHECK-NEXT: InitFunctions:
+# CHECK-NEXT: - Priority: 1
+# CHECK-NEXT: FunctionIndex: 0
# CHECK-NEXT: ...
Modified: llvm/trunk/tools/obj2yaml/wasm2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/wasm2yaml.cpp?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/wasm2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/wasm2yaml.cpp Thu Dec 14 13:10:03 2017
@@ -80,11 +80,15 @@ std::unique_ptr<WasmYAML::CustomSection>
for (const object::SymbolRef& Sym: Obj.symbols()) {
const object::WasmSymbol Symbol = Obj.getWasmSymbol(Sym);
if (Symbol.Flags != 0) {
- WasmYAML::SymbolInfo Info = { Symbol.Name, Symbol.Flags };
- LinkingSec->SymbolInfos.push_back(Info);
+ WasmYAML::SymbolInfo Info{Symbol.Name, Symbol.Flags};
+ LinkingSec->SymbolInfos.emplace_back(Info);
}
}
LinkingSec->DataSize = Obj.linkingData().DataSize;
+ for (const wasm::WasmInitFunc &Func : Obj.linkingData().InitFunctions) {
+ WasmYAML::InitFunction F{Func.Priority, Func.FunctionIndex};
+ LinkingSec->InitFunctions.emplace_back(F);
+ }
CustomSec = std::move(LinkingSec);
} else {
CustomSec = make_unique<WasmYAML::CustomSection>(WasmSec.Name);
Modified: llvm/trunk/tools/yaml2obj/yaml2wasm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2wasm.cpp?rev=320742&r1=320741&r2=320742&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2wasm.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2wasm.cpp Thu Dec 14 13:10:03 2017
@@ -162,6 +162,17 @@ int WasmWriter::writeSectionContent(raw_
}
SubSection.Done();
}
+
+ // INIT_FUNCS subsection
+ if (Section.InitFunctions.size()) {
+ encodeULEB128(wasm::WASM_INIT_FUNCS, OS);
+ encodeULEB128(Section.InitFunctions.size(), SubSection.GetStream());
+ for (const WasmYAML::InitFunction &Func : Section.InitFunctions) {
+ encodeULEB128(Func.Priority, SubSection.GetStream());
+ encodeULEB128(Func.FunctionIndex, SubSection.GetStream());
+ }
+ SubSection.Done();
+ }
return 0;
}
More information about the llvm-commits
mailing list