[lld] [lld][Wasm] Do not emit relocs against dead symbols (PR #129346)

via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 28 17:49:33 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lld

Author: Derek Schuff (dschuff)

<details>
<summary>Changes</summary>

When emitting relocs with linked output (i.e. --emit-relocs)
skip relocs against dead symbols (which donot appear in the output)
and do not emit them.


---
Full diff: https://github.com/llvm/llvm-project/pull/129346.diff


6 Files Affected:

- (modified) lld/test/wasm/emit-relocs.s (+15) 
- (modified) lld/wasm/InputChunks.cpp (+15) 
- (modified) lld/wasm/InputChunks.h (+1) 
- (modified) lld/wasm/OutputSections.cpp (+1-1) 
- (modified) lld/wasm/OutputSections.h (+1) 
- (modified) lld/wasm/Symbols.cpp (+1-1) 


``````````diff
diff --git a/lld/test/wasm/emit-relocs.s b/lld/test/wasm/emit-relocs.s
index bd136ba810b5e..385344cb23321 100644
--- a/lld/test/wasm/emit-relocs.s
+++ b/lld/test/wasm/emit-relocs.s
@@ -27,6 +27,12 @@ foo:
   .int32  0
   .size   foo, 4
 
+.section .debug_info,"",@
+.p2align 2
+.int32 unused_function
+.int32 _start
+.int32 0
+
 # CHECK:        - Type:            CODE
 # CHECK-NEXT:     Relocations:
 # CHECK-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
@@ -42,6 +48,15 @@ foo:
 # CHECK-NEXT:           Value:           1024
 # CHECK-NEXT:         Content:         '00000000'
 
+# There should be a single relocation in this section (just the live symbol)
+# CHECK-NEXT:  - Type:            CUSTOM
+# CHECK-NEXT:    Relocations:
+# CHECK-NEXT:      - Type:            R_WASM_FUNCTION_OFFSET_I32
+# CHECK-NEXT:        Index:           0
+# CHECK-NEXT:        Offset:          0x4
+# CHECK-NEXT:    Name:            .debug_info
+# CHECK-NEXT:    Payload:         FFFFFFFF0200000000000000
+
 # CHECK:        - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
diff --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp
index ccdc92f5c8d71..0558f64aa7c42 100644
--- a/lld/wasm/InputChunks.cpp
+++ b/lld/wasm/InputChunks.cpp
@@ -167,6 +167,19 @@ void InputChunk::relocate(uint8_t *buf) const {
   }
 }
 
+static bool relocIsLive(const WasmRelocation& rel, ObjFile* file) {
+  return rel.Type == R_WASM_TYPE_INDEX_LEB ||
+    file->getSymbol(rel.Index)->isLive();
+}
+
+size_t InputChunk::getNumLiveRelocations() const {
+  size_t result = 0;
+  for (const WasmRelocation& rel : relocations) {
+    if (relocIsLive(rel, file)) result ++;
+  }
+  return result;
+}
+
 // Copy relocation entries to a given output stream.
 // This function is used only when a user passes "-r". For a regular link,
 // we consume relocations instead of copying them to an output file.
@@ -179,6 +192,8 @@ void InputChunk::writeRelocations(raw_ostream &os) const {
                     << " offset=" << Twine(off) << "\n");
 
   for (const WasmRelocation &rel : relocations) {
+    if (!relocIsLive(rel, file))
+      continue;
     writeUleb128(os, rel.Type, "reloc type");
     writeUleb128(os, rel.Offset + off, "reloc offset");
     writeUleb128(os, file->calcNewIndex(rel), "reloc index");
diff --git a/lld/wasm/InputChunks.h b/lld/wasm/InputChunks.h
index f545449e1246f..1fe78d76631f1 100644
--- a/lld/wasm/InputChunks.h
+++ b/lld/wasm/InputChunks.h
@@ -77,6 +77,7 @@ class InputChunk {
   uint32_t getInputSectionOffset() const { return inputSectionOffset; }
 
   size_t getNumRelocations() const { return relocations.size(); }
+  size_t getNumLiveRelocations() const;
   void writeRelocations(llvm::raw_ostream &os) const;
   bool generateRelocationCode(raw_ostream &os) const;
 
diff --git a/lld/wasm/OutputSections.cpp b/lld/wasm/OutputSections.cpp
index d679d1e676479..5038cd8ea965b 100644
--- a/lld/wasm/OutputSections.cpp
+++ b/lld/wasm/OutputSections.cpp
@@ -274,7 +274,7 @@ void CustomSection::writeTo(uint8_t *buf) {
 uint32_t CustomSection::getNumRelocations() const {
   uint32_t count = 0;
   for (const InputChunk *inputSect : inputSections)
-    count += inputSect->getNumRelocations();
+    count += inputSect->getNumLiveRelocations();
   return count;
 }
 
diff --git a/lld/wasm/OutputSections.h b/lld/wasm/OutputSections.h
index fcc8cf45dc73b..4b0329dd16cf2 100644
--- a/lld/wasm/OutputSections.h
+++ b/lld/wasm/OutputSections.h
@@ -41,6 +41,7 @@ class OutputSection {
   virtual void writeTo(uint8_t *buf) = 0;
   virtual void finalizeContents() = 0;
   virtual uint32_t getNumRelocations() const { return 0; }
+  virtual uint32_t getNumLiveRelocations() const { return getNumRelocations(); }
   virtual void writeRelocations(raw_ostream &os) const {}
 
   std::string header;
diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp
index a687fd6d6c4ef..09f110d0885f6 100644
--- a/lld/wasm/Symbols.cpp
+++ b/lld/wasm/Symbols.cpp
@@ -183,7 +183,7 @@ void Symbol::markLive() {
 }
 
 uint32_t Symbol::getOutputSymbolIndex() const {
-  assert(outputSymbolIndex != INVALID_INDEX);
+  assert(outputSymbolIndex != INVALID_INDEX || !isLive());
   return outputSymbolIndex;
 }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/129346


More information about the llvm-commits mailing list