[WebAssembly] Fix R_WEBASSEMBLY_FUNCTION_OFFSET_I32 relocation entries

Fixes: lld: warning: unexpected existing value for R_WEBASSEMBLY_FUNCTION_OFFSET_I32: existing=839 expected=838

The existing solution is trying to erroneously recover correct offset of
the function code from the body (which is not a function segment that
includes its size, locals, and code).

The D46763 is trying to maintain the offset of the function code
allowing properly calculate the new relocation entry.

Patch by Yury Delendik

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

llvm-svn: 332412
This commit is contained in:
Sam Clegg 2018-05-15 22:27:50 +00:00
parent 9454864886
commit cfeb646f80
2 changed files with 5 additions and 15 deletions

View File

@ -134,8 +134,8 @@ public:
StringRef getName() const override { return Function->SymbolName; }
StringRef getDebugName() const override { return Function->DebugName; }
uint32_t getComdat() const override { return Function->Comdat; }
const ArrayRef<uint8_t> getFunctionBody() const { return Function->Body; }
uint32_t getFunctionInputOffset() const { return getInputSectionOffset(); }
uint32_t getFunctionCodeOffset() const { return Function->CodeOffset; }
uint32_t getFunctionIndex() const { return FunctionIndex.getValue(); }
bool hasFunctionIndex() const { return FunctionIndex.hasValue(); }
void setFunctionIndex(uint32_t Index);

View File

@ -16,7 +16,6 @@
#include "lld/Common/Memory.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/Wasm.h"
#include "llvm/Support/LEB128.h"
#include "llvm/Support/raw_ostream.h"
#define DEBUG_TYPE "lld"
@ -43,12 +42,6 @@ Optional<MemoryBufferRef> lld::wasm::readFile(StringRef Path) {
return MBRef;
}
static size_t getFunctionCodeOffset(ArrayRef<uint8_t> FunctionBody) {
unsigned Count;
llvm::decodeULEB128(FunctionBody.data(), &Count);
return Count;
}
void ObjFile::dumpInfo() const {
log("info for: " + getName() +
"\n Symbols : " + Twine(Symbols.size()) +
@ -105,10 +98,8 @@ uint32_t ObjFile::calcExpectedValue(const WasmRelocation &Reloc) const {
}
case R_WEBASSEMBLY_FUNCTION_OFFSET_I32:
if (auto *Sym = dyn_cast<DefinedFunction>(getFunctionSymbol(Reloc.Index))) {
size_t FunctionCodeOffset =
getFunctionCodeOffset(Sym->Function->getFunctionBody());
return Sym->Function->getFunctionInputOffset() + FunctionCodeOffset +
Reloc.Addend;
return Sym->Function->getFunctionInputOffset() +
Sym->Function->getFunctionCodeOffset() + Reloc.Addend;
}
return 0;
case R_WEBASSEMBLY_SECTION_OFFSET_I32:
@ -145,9 +136,8 @@ uint32_t ObjFile::calcNewValue(const WasmRelocation &Reloc) const {
return getGlobalSymbol(Reloc.Index)->getGlobalIndex();
case R_WEBASSEMBLY_FUNCTION_OFFSET_I32:
if (auto *Sym = dyn_cast<DefinedFunction>(getFunctionSymbol(Reloc.Index))) {
size_t FunctionCodeOffset =
getFunctionCodeOffset(Sym->Function->getFunctionBody());
return Sym->Function->OutputOffset + FunctionCodeOffset + Reloc.Addend;
return Sym->Function->OutputOffset +
Sym->Function->getFunctionCodeOffset() + Reloc.Addend;
}
return 0;
case R_WEBASSEMBLY_SECTION_OFFSET_I32: