[WebAssembly] Pass ownership of body to SyntheticFunction. NFC

This avoids the Writer unnecessarily having a member to retain ownership
of the function body.

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

llvm-svn: 326580
This commit is contained in:
Nicholas Wilson 2018-03-02 14:48:50 +00:00
parent cb81a0c9d9
commit f6dbc2edee
2 changed files with 15 additions and 15 deletions

View File

@ -24,6 +24,7 @@
#include "Config.h"
#include "InputFiles.h"
#include "lld/Common/ErrorHandler.h"
#include "lld/Common/Strings.h"
#include "llvm/Object/Wasm.h"
using llvm::object::WasmSegment;
@ -151,17 +152,16 @@ protected:
class SyntheticFunction : public InputFunction {
public:
SyntheticFunction(const WasmSignature &S, ArrayRef<uint8_t> Body,
StringRef Name)
: InputFunction(S, nullptr, nullptr), Name(Name), Body(Body) {}
SyntheticFunction(const WasmSignature &S, std::string Body, StringRef Name)
: InputFunction(S, nullptr, nullptr), Name(Name), Body(std::move(Body)) {}
StringRef getName() const override { return Name; }
protected:
ArrayRef<uint8_t> data() const override { return Body; }
ArrayRef<uint8_t> data() const override { return toArrayRef(Body); }
StringRef Name;
ArrayRef<uint8_t> Body;
std::string Body;
};
} // namespace wasm

View File

@ -17,7 +17,6 @@
#include "WriterUtils.h"
#include "lld/Common/ErrorHandler.h"
#include "lld/Common/Memory.h"
#include "lld/Common/Strings.h"
#include "lld/Common/Threads.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/BinaryFormat/Wasm.h"
@ -137,7 +136,6 @@ private:
std::vector<OutputSection *> OutputSections;
std::unique_ptr<FileOutputBuffer> Buffer;
std::string CtorFunctionBody;
std::vector<OutputSegment *> Segments;
llvm::SmallDenseMap<StringRef, OutputSegment *> SegmentMap;
@ -859,10 +857,10 @@ void Writer::createCtorFunction() {
uint32_t FunctionIndex = NumImportedFunctions + InputFunctions.size();
WasmSym::CallCtors->setOutputIndex(FunctionIndex);
// First write the body bytes to a string.
std::string FunctionBody;
// First write the body's contents to a string.
std::string BodyContent;
{
raw_string_ostream OS(FunctionBody);
raw_string_ostream OS(BodyContent);
writeUleb128(OS, 0, "num locals");
for (const WasmInitEntry &F : InitFunctions) {
writeU8(OS, OPCODE_CALL, "CALL");
@ -872,14 +870,16 @@ void Writer::createCtorFunction() {
}
// Once we know the size of the body we can create the final function body
raw_string_ostream OS(CtorFunctionBody);
writeUleb128(OS, FunctionBody.size(), "function size");
OS.flush();
CtorFunctionBody += FunctionBody;
std::string FunctionBody;
{
raw_string_ostream OS(FunctionBody);
writeUleb128(OS, BodyContent.size(), "function size");
OS << BodyContent;
}
const WasmSignature *Sig = WasmSym::CallCtors->getFunctionType();
SyntheticFunction *F = make<SyntheticFunction>(
*Sig, toArrayRef(CtorFunctionBody), WasmSym::CallCtors->getName());
*Sig, std::move(FunctionBody), WasmSym::CallCtors->getName());
F->setOutputIndex(FunctionIndex);
F->Live = true;