[PATCH] D46765: [WebAssembly] Fix R_WEBASSEMBLY_FUNCTION_OFFSET_I32 relocation entries

Yury Delendik via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 11 11:34:07 PDT 2018


yurydelendik created this revision.
yurydelendik added a reviewer: sbc100.
Herald added subscribers: llvm-commits, sunfish, aheejin, jgravelle-google, dschuff.

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 https://reviews.llvm.org/D46763 is trying to maintain the offset of the function code allowing
properly calculate the new relocation entry.

(Test case is possible, but will require 128+ bytes function code segments)


Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D46765

Files:
  wasm/InputChunks.h
  wasm/InputFiles.cpp


Index: wasm/InputFiles.cpp
===================================================================
--- wasm/InputFiles.cpp
+++ wasm/InputFiles.cpp
@@ -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 @@
   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 @@
   }
   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 @@
     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:
Index: wasm/InputChunks.h
===================================================================
--- wasm/InputChunks.h
+++ wasm/InputChunks.h
@@ -136,6 +136,7 @@
   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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46765.146371.patch
Type: text/x-patch
Size: 2451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180511/322392be/attachment.bin>


More information about the llvm-commits mailing list