[lld] [llvm] [WebAssembly] Add target architecture to object file format (PR #225979)

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 24 09:51:12 PDT 2026


https://github.com/sbc100 updated https://github.com/llvm/llvm-project/pull/225979

>From 3c113eb08390aee54bef37c7b6eb502e41bb0172 Mon Sep 17 00:00:00 2001
From: Sam Clegg <sbc at chromium.org>
Date: Wed, 23 Sep 2026 16:58:33 -0700
Subject: [PATCH] [WebAssembly] Add target architecture to object file format

Store the target architecture string (`wasm32` or `wasm64`) in a new
`WASM_TARGET_ARCH` subsection in the `linking` custom section and in a
new `WASM_DYLINK_TARGET_ARCH` subsection in the `dylink.0` custom
section.

Previously, architecture detection for object files and shared libraries
relied on heuristics (such as whether memory64 was imported/defined or
presence of 64-bit relocations). For modules that do not access memory,
this resulted in wasm64 objects/shared libraries being incorrectly
detected as wasm32.

With this change:
- `WasmObjectWriter` emits the `WASM_TARGET_ARCH` subsection in
  `linking`.
- `wasm-ld` emits `WASM_DYLINK_TARGET_ARCH` when generating shared
  libraries and `WASM_TARGET_ARCH` when generating relocatable output
  (`-r`).
- `WasmObjectFile::getArch()` checks these subsections first before
  falling back to the `HasMemory64` heuristic.
- `SharedFile` in `lld` now checks the object architecture via
  `checkArch()`.
- Added support to `obj2yaml` and `yaml2obj`.

Fixes: #98778
---
 lld/test/wasm/check-arch-32-in-64.test         |  3 +++
 lld/test/wasm/check-arch-64-in-32.test         |  3 +++
 lld/test/wasm/dylink.s                         |  1 +
 lld/test/wasm/emit-relocs.s                    |  1 +
 lld/test/wasm/locals-duplicate.test            |  1 +
 lld/test/wasm/lto/relocatable-undefined.ll     |  1 +
 lld/test/wasm/pie.s                            |  1 +
 lld/test/wasm/relocatable.ll                   |  1 +
 lld/test/wasm/rpath.s                          |  1 +
 lld/test/wasm/shared-needed.s                  |  2 ++
 lld/test/wasm/shared-weak-undefined.s          |  1 +
 lld/test/wasm/shared.s                         |  1 +
 lld/test/wasm/shared64.s                       |  1 +
 lld/test/wasm/signature-mismatch-relocatable.s |  1 +
 lld/test/wasm/signature-mismatch.s             |  1 +
 lld/test/wasm/stack-pointer.s                  |  1 +
 lld/test/wasm/tls-export.s                     |  2 ++
 lld/test/wasm/weak-alias.s                     |  1 +
 lld/wasm/InputFiles.cpp                        |  8 ++------
 lld/wasm/SyntheticSections.cpp                 | 14 ++++++++++++++
 llvm/include/llvm/BinaryFormat/Wasm.h          |  4 ++++
 llvm/include/llvm/ObjectYAML/WasmYAML.h        |  2 ++
 llvm/lib/MC/WasmObjectWriter.cpp               |  4 ++++
 llvm/lib/Object/WasmObjectFile.cpp             | 15 ++++++++++++++-
 llvm/lib/ObjectYAML/WasmEmitter.cpp            | 14 ++++++++++++++
 llvm/lib/ObjectYAML/WasmYAML.cpp               |  2 ++
 llvm/test/CodeGen/WebAssembly/profile.ll       |  1 +
 llvm/test/MC/WebAssembly/assembler-binary.ll   |  1 +
 .../test/MC/WebAssembly/call-indirect-relocs.s |  1 +
 llvm/test/MC/WebAssembly/comdat.ll             |  1 +
 llvm/test/MC/WebAssembly/common.s              |  1 +
 llvm/test/MC/WebAssembly/custom-sections.ll    |  2 +-
 llvm/test/MC/WebAssembly/data-section.s        |  2 ++
 llvm/test/MC/WebAssembly/debug-info.ll         | 16 ++++++++--------
 llvm/test/MC/WebAssembly/debug-info64.ll       | 18 +++++++++---------
 llvm/test/MC/WebAssembly/export-name.s         |  1 +
 llvm/test/MC/WebAssembly/function-sections.ll  |  1 +
 llvm/test/MC/WebAssembly/global-ctor-dtor.ll   |  1 +
 llvm/test/MC/WebAssembly/globals.s             |  1 +
 llvm/test/MC/WebAssembly/init-array-label.s    |  1 +
 llvm/test/MC/WebAssembly/init-array.s          |  1 +
 llvm/test/MC/WebAssembly/reloc-pic.s           |  1 +
 llvm/test/MC/WebAssembly/reloc-pic64.s         |  1 +
 llvm/test/MC/WebAssembly/tables.s              |  1 +
 llvm/test/MC/WebAssembly/tag-section.s         |  1 +
 llvm/test/MC/WebAssembly/tls.s                 |  1 +
 llvm/test/MC/WebAssembly/tls64.s               |  1 +
 llvm/test/MC/WebAssembly/type-index.s          |  1 +
 llvm/test/MC/WebAssembly/unnamed-data.ll       |  3 ++-
 llvm/test/MC/WebAssembly/wasm64.s              |  1 +
 llvm/test/MC/WebAssembly/weak-alias.s          |  2 ++
 llvm/test/ObjectYAML/wasm/dylink_section.yaml  |  2 ++
 llvm/test/ObjectYAML/wasm/linking_section.yaml |  6 +++++-
 llvm/tools/obj2yaml/wasm2yaml.cpp              |  2 ++
 54 files changed, 132 insertions(+), 27 deletions(-)

diff --git a/lld/test/wasm/check-arch-32-in-64.test b/lld/test/wasm/check-arch-32-in-64.test
index b4eb925d0f04b..67e1f3782855c 100644
--- a/lld/test/wasm/check-arch-32-in-64.test
+++ b/lld/test/wasm/check-arch-32-in-64.test
@@ -1,4 +1,7 @@
 RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/start.s -o %t.o
 RUN: not wasm-ld -mwasm64 %t.o -o %t.wasm 2>&1 | FileCheck %s
 
+RUN: wasm-ld -shared --no-entry %t.o -o %t.so
+RUN: not wasm-ld -mwasm64 %t.so -o %t2.wasm 2>&1 | FileCheck %s
+
 CHECK: wasm32 object file can't be linked in wasm64 mode
diff --git a/lld/test/wasm/check-arch-64-in-32.test b/lld/test/wasm/check-arch-64-in-32.test
index 8b23e5f5c1deb..5483167ec1b1c 100644
--- a/lld/test/wasm/check-arch-64-in-32.test
+++ b/lld/test/wasm/check-arch-64-in-32.test
@@ -1,4 +1,7 @@
 RUN: llvm-mc -filetype=obj -triple=wasm64-unknown-unknown %p/Inputs/start.s -o %t.o
 RUN: not wasm-ld %t.o -o %t.wasm 2>&1 | FileCheck %s
 
+RUN: wasm-ld -mwasm64 -shared --no-entry %t.o -o %t.so
+RUN: not wasm-ld %t.so -o %t2.wasm 2>&1 | FileCheck %s
+
 CHECK: must specify -mwasm64 to process wasm64 object files
diff --git a/lld/test/wasm/dylink.s b/lld/test/wasm/dylink.s
index d129f9032a2d2..856b9bc0cdd99 100644
--- a/lld/test/wasm/dylink.s
+++ b/lld/test/wasm/dylink.s
@@ -36,6 +36,7 @@ _start:
 # CHECK:      Sections:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            dylink.0
+# CHECK-NEXT:     TargetArch:      {{wasm32|wasm64}}
 # CHECK-NEXT:     MemorySize:      0
 # CHECK-NEXT:     MemoryAlignment: 0
 # CHECK-NEXT:     TableSize:       0
diff --git a/lld/test/wasm/emit-relocs.s b/lld/test/wasm/emit-relocs.s
index 3df345c0c7038..86a38bb778766 100644
--- a/lld/test/wasm/emit-relocs.s
+++ b/lld/test/wasm/emit-relocs.s
@@ -60,6 +60,7 @@ foo:
 # CHECK:        - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            FUNCTION
diff --git a/lld/test/wasm/locals-duplicate.test b/lld/test/wasm/locals-duplicate.test
index fbbd7d8d20d5f..c2f2b3a80633c 100644
--- a/lld/test/wasm/locals-duplicate.test
+++ b/lld/test/wasm/locals-duplicate.test
@@ -369,6 +369,7 @@
 ; RELOC-NEXT:   - Type:            CUSTOM
 ; RELOC-NEXT:     Name:            linking
 ; RELOC-NEXT:     Version:         2
+; RELOC-NEXT:     TargetArch:      wasm32
 ; RELOC-NEXT:     SymbolTable:
 ; RELOC-NEXT:       - Index:           0
 ; RELOC-NEXT:         Kind:            FUNCTION
diff --git a/lld/test/wasm/lto/relocatable-undefined.ll b/lld/test/wasm/lto/relocatable-undefined.ll
index 37ec50e131961..e903f4e1599b9 100644
--- a/lld/test/wasm/lto/relocatable-undefined.ll
+++ b/lld/test/wasm/lto/relocatable-undefined.ll
@@ -19,6 +19,7 @@ entry:
 ; CHECK:        - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     Version:         2
+; CHECK-NEXT:     TargetArch:      wasm32
 ; CHECK-NEXT:     SymbolTable:     
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Kind:            FUNCTION
diff --git a/lld/test/wasm/pie.s b/lld/test/wasm/pie.s
index a86f50f04ce16..702f55846f0c5 100644
--- a/lld/test/wasm/pie.s
+++ b/lld/test/wasm/pie.s
@@ -76,6 +76,7 @@ _start:
 # CHECK:      Sections:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            dylink.0
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     MemorySize:      16
 # CHECK-NEXT:     MemoryAlignment: 2
 # CHECK-NEXT:     TableSize:       3
diff --git a/lld/test/wasm/relocatable.ll b/lld/test/wasm/relocatable.ll
index 45be3167038bb..014ce80a52907 100644
--- a/lld/test/wasm/relocatable.ll
+++ b/lld/test/wasm/relocatable.ll
@@ -176,6 +176,7 @@ define void @_start() {
 ; CHECK-NEXT:  - Type:            CUSTOM
 ; CHECK-NEXT:    Name:            linking
 ; CHECK-NEXT:    Version:         2
+; CHECK-NEXT:    TargetArch:      wasm32
 ; CHECK-NEXT:    SymbolTable:
 ; CHECK-NEXT:      - Index:           0
 ; CHECK-NEXT:        Kind:            FUNCTION
diff --git a/lld/test/wasm/rpath.s b/lld/test/wasm/rpath.s
index 1b430b40966a9..15649a91f48de 100644
--- a/lld/test/wasm/rpath.s
+++ b/lld/test/wasm/rpath.s
@@ -4,6 +4,7 @@
 
 # CHECK:  - Type:            CUSTOM
 # CHECK-NEXT:    Name:            dylink.0
+# CHECK-NEXT:    TargetArch:      wasm32
 # CHECK-NEXT:    MemorySize:      0
 # CHECK-NEXT:    MemoryAlignment: 0
 # CHECK-NEXT:    TableSize:       0
diff --git a/lld/test/wasm/shared-needed.s b/lld/test/wasm/shared-needed.s
index bdc7dc3ce7d65..2c291bebfc31a 100644
--- a/lld/test/wasm/shared-needed.s
+++ b/lld/test/wasm/shared-needed.s
@@ -35,6 +35,7 @@ data:
 # SO1:      Sections:
 # SO1-NEXT:   - Type:            CUSTOM
 # SO1-NEXT:     Name:            dylink.0
+# SO1-NEXT:     TargetArch:      wasm32
 # SO1-NEXT:     MemorySize:      0
 # SO1-NEXT:     MemoryAlignment: 0
 # SO1-NEXT:     TableSize:       0
@@ -45,6 +46,7 @@ data:
 # SO2:      Sections:
 # SO2-NEXT:   - Type:            CUSTOM
 # SO2-NEXT:     Name:            dylink.0
+# SO2-NEXT:     TargetArch:      wasm32
 # SO2-NEXT:     MemorySize:      4
 # SO2-NEXT:     MemoryAlignment: 2
 # SO2-NEXT:     TableSize:       0
diff --git a/lld/test/wasm/shared-weak-undefined.s b/lld/test/wasm/shared-weak-undefined.s
index 7be38a1cea30b..d798358e994e5 100644
--- a/lld/test/wasm/shared-weak-undefined.s
+++ b/lld/test/wasm/shared-weak-undefined.s
@@ -48,6 +48,7 @@ call_weak_libfunc:
 #      CHECK: Sections:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            dylink.0
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     MemorySize:      0
 # CHECK-NEXT:     MemoryAlignment: 0
 # CHECK-NEXT:     TableSize:       0
diff --git a/lld/test/wasm/shared.s b/lld/test/wasm/shared.s
index 1ea95d90ca0af..eb58552724420 100644
--- a/lld/test/wasm/shared.s
+++ b/lld/test/wasm/shared.s
@@ -129,6 +129,7 @@ get_local_func_address:
 # CHECK:      Sections:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            dylink.0
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     MemorySize:      24
 # CHECK-NEXT:     MemoryAlignment: 2
 # CHECK-NEXT:     TableSize:       2
diff --git a/lld/test/wasm/shared64.s b/lld/test/wasm/shared64.s
index da0577b03ec73..2ededb9b33272 100644
--- a/lld/test/wasm/shared64.s
+++ b/lld/test/wasm/shared64.s
@@ -130,6 +130,7 @@ get_local_func_address:
 # CHECK:      Sections:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            dylink.0
+# CHECK-NEXT:     TargetArch:      wasm64
 # CHECK-NEXT:     MemorySize:      36
 # CHECK-NEXT:     MemoryAlignment: 2
 # CHECK-NEXT:     TableSize:       2
diff --git a/lld/test/wasm/signature-mismatch-relocatable.s b/lld/test/wasm/signature-mismatch-relocatable.s
index e4eddd3671af2..6a3d461550a02 100644
--- a/lld/test/wasm/signature-mismatch-relocatable.s
+++ b/lld/test/wasm/signature-mismatch-relocatable.s
@@ -23,6 +23,7 @@ _start:
 #      CHECK:  - Type:            CUSTOM
 # CHECK-NEXT:    Name:            linking
 # CHECK-NEXT:    Version:         2
+# CHECK-NEXT:    TargetArch:      wasm32
 # CHECK-NEXT:    SymbolTable:
 # CHECK-NEXT:      - Index:           0
 # CHECK-NEXT:        Kind:            FUNCTION
diff --git a/lld/test/wasm/signature-mismatch.s b/lld/test/wasm/signature-mismatch.s
index 9c9e81c29fa66..b52f875589781 100644
--- a/lld/test/wasm/signature-mismatch.s
+++ b/lld/test/wasm/signature-mismatch.s
@@ -81,6 +81,7 @@ ret32_address_main:
 
 #      RELOC:     Name:            linking
 # RELOC-NEXT:     Version:         2
+# RELOC-NEXT:     TargetArch:      wasm32
 # RELOC-NEXT:     SymbolTable:
 # RELOC-NEXT:       - Index:           0
 # RELOC-NEXT:         Kind:            FUNCTION
diff --git a/lld/test/wasm/stack-pointer.s b/lld/test/wasm/stack-pointer.s
index 902ac493d3dec..8f668ee308a58 100644
--- a/lld/test/wasm/stack-pointer.s
+++ b/lld/test/wasm/stack-pointer.s
@@ -48,6 +48,7 @@ _start:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            FUNCTION
diff --git a/lld/test/wasm/tls-export.s b/lld/test/wasm/tls-export.s
index 8660a71cf5448..cae13dc023f97 100644
--- a/lld/test/wasm/tls-export.s
+++ b/lld/test/wasm/tls-export.s
@@ -46,6 +46,8 @@ _start:
   .ascii "mutable-globals"
 
 
+#      CHECK:    Name:            dylink.0
+# CHECK-NEXT:    TargetArch:      wasm32
 #      CHECK:    ExportInfo:
 # CHECK-NEXT:      - Name:            tls1
 # CHECK-NEXT:        Flags:           [ TLS ]
diff --git a/lld/test/wasm/weak-alias.s b/lld/test/wasm/weak-alias.s
index 22e84bf0e37a6..0431e4fc82929 100644
--- a/lld/test/wasm/weak-alias.s
+++ b/lld/test/wasm/weak-alias.s
@@ -209,6 +209,7 @@ _start:
 # RELOC-NEXT:   - Type:            CUSTOM
 # RELOC-NEXT:     Name:            linking
 # RELOC-NEXT:     Version:         2
+# RELOC-NEXT:     TargetArch:      wasm32
 # RELOC-NEXT:     SymbolTable:
 # RELOC-NEXT:       - Index:           0
 # RELOC-NEXT:         Kind:            FUNCTION
diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index f5595f4bf25c9..89905006073a5 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -419,12 +419,6 @@ ObjFile::ObjFile(MemoryBufferRef m, StringRef archiveName, bool lazy)
   this->lazy = lazy;
   this->archiveName = std::string(archiveName);
 
-  // Currently we only do this check for regular object file, and not for shared
-  // object files.  This is because architecture detection for shared objects is
-  // currently based on a heuristic, which is fallable:
-  // https://github.com/llvm/llvm-project/issues/98778
-  checkArch(wasmObj->getArch());
-
   // Unless we are processing this as a lazy object file (e.g. part of an
   // archive file or within `--start-lib`/`--end-lib`, it's eagerly linked, so
   // mark it live.
@@ -490,6 +484,8 @@ WasmFileBase::WasmFileBase(Kind k, MemoryBufferRef m) : InputFile(k, m) {
 
   bin.release();
   wasmObj.reset(obj);
+
+  checkArch(wasmObj->getArch());
 }
 
 void ObjFile::parse(bool ignoreComdats) {
diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp
index 79adafb418cb2..c629ed3cf2bb4 100644
--- a/lld/wasm/SyntheticSections.cpp
+++ b/lld/wasm/SyntheticSections.cpp
@@ -152,6 +152,13 @@ void DylinkSection::writeBody() {
       writeStr(sub.os, ref, "rpath entry");
     sub.writeTo(os);
   }
+
+  {
+    SubSection sub(WASM_DYLINK_TARGET_ARCH);
+    writeStr(sub.os, ctx.arg.is64.value_or(false) ? "wasm64" : "wasm32",
+             "target arch");
+    sub.writeTo(os);
+  }
 }
 
 uint32_t TypeSection::registerType(const WasmSignature &sig) {
@@ -806,6 +813,13 @@ void LinkingSection::writeBody() {
     }
     sub.writeTo(os);
   }
+
+  {
+    SubSection sub(WASM_TARGET_ARCH);
+    writeStr(sub.os, ctx.arg.is64.value_or(false) ? "wasm64" : "wasm32",
+             "target arch");
+    sub.writeTo(os);
+  }
 }
 
 void LinkingSection::addToSymtab(Symbol *sym) {
diff --git a/llvm/include/llvm/BinaryFormat/Wasm.h b/llvm/include/llvm/BinaryFormat/Wasm.h
index f8020a823dda4..c351ea42e5636 100644
--- a/llvm/include/llvm/BinaryFormat/Wasm.h
+++ b/llvm/include/llvm/BinaryFormat/Wasm.h
@@ -205,6 +205,7 @@ enum : unsigned {
   WASM_INIT_FUNCS = 0x6,
   WASM_COMDAT_INFO = 0x7,
   WASM_SYMBOL_TABLE = 0x8,
+  WASM_TARGET_ARCH = 0x9,
 };
 
 // Kind codes used in the custom "dylink" section
@@ -214,6 +215,7 @@ enum : unsigned {
   WASM_DYLINK_EXPORT_INFO = 0x3,
   WASM_DYLINK_IMPORT_INFO = 0x4,
   WASM_DYLINK_RUNTIME_PATH = 0x5,
+  WASM_DYLINK_TARGET_ARCH = 0x6,
 };
 
 // Kind codes used in the custom "linking" section in the WASM_COMDAT_INFO
@@ -309,6 +311,7 @@ struct WasmDylinkInfo {
   std::vector<WasmDylinkImportInfo> ImportInfo;
   std::vector<WasmDylinkExportInfo> ExportInfo;
   std::vector<StringRef> RuntimePath;
+  StringRef TargetArch;
 };
 
 struct WasmProducerInfo {
@@ -514,6 +517,7 @@ struct WasmLinkingData {
   uint32_t Version;
   std::vector<WasmInitFunc> InitFunctions;
   std::vector<StringRef> Comdats;
+  StringRef TargetArch;
   // The linking section also contains a symbol table. This info (represented
   // in a WasmSymbolInfo struct) is stored inside the WasmSymbol object instead
   // of in this structure; this allows vectors of WasmSymbols and
diff --git a/llvm/include/llvm/ObjectYAML/WasmYAML.h b/llvm/include/llvm/ObjectYAML/WasmYAML.h
index 81a93d113b72b..a766404bf9631 100644
--- a/llvm/include/llvm/ObjectYAML/WasmYAML.h
+++ b/llvm/include/llvm/ObjectYAML/WasmYAML.h
@@ -233,6 +233,7 @@ struct DylinkSection : CustomSection {
   std::vector<DylinkImportInfo> ImportInfo;
   std::vector<DylinkExportInfo> ExportInfo;
   std::vector<StringRef> RuntimePath;
+  StringRef TargetArch;
 };
 
 struct NameSection : CustomSection {
@@ -261,6 +262,7 @@ struct LinkingSection : CustomSection {
   std::vector<SegmentInfo> SegmentInfos;
   std::vector<InitFunction> InitFunctions;
   std::vector<Comdat> Comdats;
+  StringRef TargetArch;
 };
 
 struct ProducersSection : CustomSection {
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp
index aa3edd82ff30a..93209aab83af1 100644
--- a/llvm/lib/MC/WasmObjectWriter.cpp
+++ b/llvm/lib/MC/WasmObjectWriter.cpp
@@ -1223,6 +1223,10 @@ void WasmObjectWriter::writeLinkingMetaDataSection(
     endSection(SubSection);
   }
 
+  startSection(SubSection, wasm::WASM_TARGET_ARCH);
+  writeString(TargetObjectWriter->is64Bit() ? "wasm64" : "wasm32");
+  endSection(SubSection);
+
   endSection(Section);
 }
 
diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp
index d54e337da8c66..713849b4ce63d 100644
--- a/llvm/lib/Object/WasmObjectFile.cpp
+++ b/llvm/lib/Object/WasmObjectFile.cpp
@@ -506,6 +506,9 @@ Error WasmObjectFile::parseDylink0Section(ReadContext &Ctx) {
       }
       break;
     }
+    case wasm::WASM_DYLINK_TARGET_ARCH:
+      DylinkInfo.TargetArch = readString(Ctx);
+      break;
     default:
       LLVM_DEBUG(dbgs() << "unknown dylink.0 sub-section: " << Type << "\n");
       Ctx.Ptr += Size;
@@ -694,6 +697,9 @@ Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) {
       if (Error Err = parseLinkingSectionComdat(Ctx))
         return Err;
       break;
+    case wasm::WASM_TARGET_ARCH:
+      LinkingData.TargetArch = readString(Ctx);
+      break;
     default:
       Ctx.Ptr += Size;
       break;
@@ -2191,12 +2197,19 @@ section_iterator WasmObjectFile::section_end() const {
 }
 
 uint8_t WasmObjectFile::getBytesInAddress() const {
-  return HasMemory64 ? 8 : 4;
+  return getArch() == Triple::wasm64 ? 8 : 4;
 }
 
 StringRef WasmObjectFile::getFileFormatName() const { return "WASM"; }
 
 Triple::ArchType WasmObjectFile::getArch() const {
+  if (!LinkingData.TargetArch.empty())
+    return Triple(LinkingData.TargetArch).getArch();
+  if (!DylinkInfo.TargetArch.empty())
+    return Triple(DylinkInfo.TargetArch).getArch();
+  // Fall back to the HasMemory64 heuristic for backwards compatibility with
+  // older object files/shared libraries that lack target architecture metadata,
+  // as well as final executables that lack custom linking/dylink sections.
   return HasMemory64 ? Triple::wasm64 : Triple::wasm32;
 }
 
diff --git a/llvm/lib/ObjectYAML/WasmEmitter.cpp b/llvm/lib/ObjectYAML/WasmEmitter.cpp
index c676f6b7a23bc..8406ad6b6dc3d 100644
--- a/llvm/lib/ObjectYAML/WasmEmitter.cpp
+++ b/llvm/lib/ObjectYAML/WasmEmitter.cpp
@@ -208,6 +208,12 @@ void WasmWriter::writeSectionContent(raw_ostream &OS,
       writeStringRef(Path, SubOS);
     SubSection.done();
   }
+  if (!Section.TargetArch.empty()) {
+    writeUint8(OS, wasm::WASM_DYLINK_TARGET_ARCH);
+    raw_ostream &SubOS = SubSection.getStream();
+    writeStringRef(Section.TargetArch, SubOS);
+    SubSection.done();
+  }
 }
 
 void WasmWriter::writeSectionContent(raw_ostream &OS,
@@ -299,6 +305,14 @@ void WasmWriter::writeSectionContent(raw_ostream &OS,
     }
     SubSection.done();
   }
+
+  // TARGET_ARCH subsection
+  if (!Section.TargetArch.empty()) {
+    writeUint8(OS, wasm::WASM_TARGET_ARCH);
+    raw_ostream &SubOS = SubSection.getStream();
+    writeStringRef(Section.TargetArch, SubOS);
+    SubSection.done();
+  }
 }
 
 void WasmWriter::writeSectionContent(raw_ostream &OS,
diff --git a/llvm/lib/ObjectYAML/WasmYAML.cpp b/llvm/lib/ObjectYAML/WasmYAML.cpp
index 8c93d3a0763f7..d5030b8196c20 100644
--- a/llvm/lib/ObjectYAML/WasmYAML.cpp
+++ b/llvm/lib/ObjectYAML/WasmYAML.cpp
@@ -52,6 +52,7 @@ static void commonSectionMapping(IO &IO, WasmYAML::Section &Section) {
 static void sectionMapping(IO &IO, WasmYAML::DylinkSection &Section) {
   commonSectionMapping(IO, Section);
   IO.mapRequired("Name", Section.Name);
+  IO.mapOptional("TargetArch", Section.TargetArch, StringRef());
   IO.mapRequired("MemorySize", Section.MemorySize);
   IO.mapRequired("MemoryAlignment", Section.MemoryAlignment);
   IO.mapRequired("TableSize", Section.TableSize);
@@ -74,6 +75,7 @@ static void sectionMapping(IO &IO, WasmYAML::LinkingSection &Section) {
   commonSectionMapping(IO, Section);
   IO.mapRequired("Name", Section.Name);
   IO.mapRequired("Version", Section.Version);
+  IO.mapOptional("TargetArch", Section.TargetArch, StringRef());
   IO.mapOptional("SymbolTable", Section.SymbolTable);
   IO.mapOptional("SegmentInfo", Section.SegmentInfos);
   IO.mapOptional("InitFunctions", Section.InitFunctions);
diff --git a/llvm/test/CodeGen/WebAssembly/profile.ll b/llvm/test/CodeGen/WebAssembly/profile.ll
index 27802cc3bf356..46064be4b8fba 100644
--- a/llvm/test/CodeGen/WebAssembly/profile.ll
+++ b/llvm/test/CodeGen/WebAssembly/profile.ll
@@ -36,6 +36,7 @@ $__covrec_B = comdat any
 ; CHECK-NEXT: - Type:            CUSTOM
 ; CHECK-NEXT:   Name:            linking
 ; CHECK-NEXT:   Version:         2
+; CHECK-NEXT:   TargetArch:      wasm32
 ; CHECK-NEXT:   Comdats:
 ; CHECK-NEXT:     - Name:            __covrec_A
 ; CHECK-NEXT:       Entries:
diff --git a/llvm/test/MC/WebAssembly/assembler-binary.ll b/llvm/test/MC/WebAssembly/assembler-binary.ll
index 32f7d679b8968..1cbd8b1c18738 100644
--- a/llvm/test/MC/WebAssembly/assembler-binary.ll
+++ b/llvm/test/MC/WebAssembly/assembler-binary.ll
@@ -67,6 +67,7 @@ entry:
 ; CHECK-NEXT:   - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     Version:         2
+; CHECK-NEXT:     TargetArch:      wasm32
 ; CHECK-NEXT:     SymbolTable:
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/call-indirect-relocs.s b/llvm/test/MC/WebAssembly/call-indirect-relocs.s
index 8a1b6451982fa..60c13556ef88d 100644
--- a/llvm/test/MC/WebAssembly/call-indirect-relocs.s
+++ b/llvm/test/MC/WebAssembly/call-indirect-relocs.s
@@ -69,6 +69,7 @@ empty_fref_table:
 # BIN-NEXT:   - Type:            CUSTOM
 # BIN-NEXT:     Name:            linking
 # BIN-NEXT:     Version:         2
+# BIN-NEXT:     TargetArch:      wasm32
 # BIN-NEXT:     SymbolTable:
 # BIN-NEXT:       - Index:           0
 # BIN-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/comdat.ll b/llvm/test/MC/WebAssembly/comdat.ll
index 0886301597471..0a2a86fd13422 100644
--- a/llvm/test/MC/WebAssembly/comdat.ll
+++ b/llvm/test/MC/WebAssembly/comdat.ll
@@ -76,6 +76,7 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) {
 ; CHECK-NEXT:  - Type:            CUSTOM
 ; CHECK-NEXT:    Name:            linking
 ; CHECK-NEXT:    Version:         2
+; CHECK-NEXT:    TargetArch:      wasm32
 ; CHECK-NEXT:    SymbolTable:
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/common.s b/llvm/test/MC/WebAssembly/common.s
index 9af65dbcc4a84..10aaabb2d7bcb 100644
--- a/llvm/test/MC/WebAssembly/common.s
+++ b/llvm/test/MC/WebAssembly/common.s
@@ -10,6 +10,7 @@
 # CHECK:        - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            DATA
diff --git a/llvm/test/MC/WebAssembly/custom-sections.ll b/llvm/test/MC/WebAssembly/custom-sections.ll
index ba669716c934d..9c1519e4319b1 100644
--- a/llvm/test/MC/WebAssembly/custom-sections.ll
+++ b/llvm/test/MC/WebAssembly/custom-sections.ll
@@ -27,6 +27,6 @@ target triple = "wasm32-unknown-unknown"
 ; CHECK:  Section {
 ; CHECK:    Type: CUSTOM (0x0)
 ; CHECK:    Size: 25
-; CHECK:    Offset: 90
+; CHECK:    Offset: 103
 ; CHECK:    Name: producers
 ; CHECK:  }
diff --git a/llvm/test/MC/WebAssembly/data-section.s b/llvm/test/MC/WebAssembly/data-section.s
index 72c735fec0f35..add9c188a7619 100644
--- a/llvm/test/MC/WebAssembly/data-section.s
+++ b/llvm/test/MC/WebAssembly/data-section.s
@@ -77,6 +77,8 @@ test0:
 # BIN-NEXT:   - Type:            CUSTOM
 # BIN-NEXT:     Name:            linking
 # BIN-NEXT:     Version:         2
+# BIN32-NEXT:   TargetArch:      wasm32
+# BIN64-NEXT:   TargetArch:      wasm64
 # BIN-NEXT:     SymbolTable:
 # BIN-NEXT:       - Index:           0
 # BIN-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/debug-info.ll b/llvm/test/MC/WebAssembly/debug-info.ll
index 5080a5364242d..49967d564e094 100644
--- a/llvm/test/MC/WebAssembly/debug-info.ll
+++ b/llvm/test/MC/WebAssembly/debug-info.ll
@@ -95,50 +95,50 @@
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
-; CHECK-NEXT:    Size: 91
+; CHECK-NEXT:    Size: 104
 ; CHECK-NEXT:    Offset: 805
 ; CHECK-NEXT:    Name: linking
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
 ; CHECK-NEXT:    Size: 9
-; CHECK-NEXT:    Offset: 910
+; CHECK-NEXT:    Offset: 923
 ; CHECK-NEXT:    Name: reloc.DATA
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
 ; CHECK-NEXT:    Size: 61
-; CHECK-NEXT:    Offset: 936
+; CHECK-NEXT:    Offset: 949
 ; CHECK-NEXT:    Name: reloc..debug_info
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
 ; CHECK-NEXT:    Size: 18
-; CHECK-NEXT:    Offset: 1021
+; CHECK-NEXT:    Offset: 1034
 ; CHECK-NEXT:    Name: reloc..debug_aranges
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
 ; CHECK-NEXT:    Size: 6
-; CHECK-NEXT:    Offset: 1066
+; CHECK-NEXT:    Offset: 1079
 ; CHECK-NEXT:    Name: reloc..debug_pubnames
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
 ; CHECK-NEXT:    Size: 6
-; CHECK-NEXT:    Offset: 1100
+; CHECK-NEXT:    Offset: 1113
 ; CHECK-NEXT:    Name: reloc..debug_pubtypes
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
 ; CHECK-NEXT:    Size: 6
-; CHECK-NEXT:    Offset: 1134
+; CHECK-NEXT:    Offset: 1147
 ; CHECK-NEXT:    Name: reloc..debug_line
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:  Section {
 ; CHECK-NEXT:    Type: CUSTOM (0x0)
 ; CHECK-NEXT:    Size: 77
-; CHECK-NEXT:    Offset: 1164
+; CHECK-NEXT:    Offset: 1177
 ; CHECK-NEXT:    Name: producers
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:]
diff --git a/llvm/test/MC/WebAssembly/debug-info64.ll b/llvm/test/MC/WebAssembly/debug-info64.ll
index 2091b87e10828..65aa51e6646a0 100644
--- a/llvm/test/MC/WebAssembly/debug-info64.ll
+++ b/llvm/test/MC/WebAssembly/debug-info64.ll
@@ -95,56 +95,56 @@
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
-; CHECK-NEXT:     Size: 91
+; CHECK-NEXT:     Size: 104
 ; CHECK-NEXT:     Offset: 865
 ; CHECK-NEXT:     Name: linking
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 9
-; CHECK-NEXT:     Offset: 970
+; CHECK-NEXT:     Offset: 983
 ; CHECK-NEXT:     Name: reloc.DATA
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 61
-; CHECK-NEXT:     Offset: 996
+; CHECK-NEXT:     Offset: 1009
 ; CHECK-NEXT:     Name: reloc..debug_info
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 18
-; CHECK-NEXT:     Offset: 1081
+; CHECK-NEXT:     Offset: 1094
 ; CHECK-NEXT:     Name: reloc..debug_aranges
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 6
-; CHECK-NEXT:     Offset: 1126
+; CHECK-NEXT:     Offset: 1139
 ; CHECK-NEXT:     Name: reloc..debug_pubnames
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 6
-; CHECK-NEXT:     Offset: 1160
+; CHECK-NEXT:     Offset: 1173
 ; CHECK-NEXT:     Name: reloc..debug_pubtypes
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 6
-; CHECK-NEXT:     Offset: 1194
+; CHECK-NEXT:     Offset: 1207
 ; CHECK-NEXT:     Name: reloc..debug_line
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 77
-; CHECK-NEXT:     Offset: 1224
+; CHECK-NEXT:     Offset: 1237
 ; CHECK-NEXT:     Name: producers
 ; CHECK-NEXT:   }
 ; CHECK-NEXT:   Section {
 ; CHECK-NEXT:     Type: CUSTOM (0x0)
 ; CHECK-NEXT:     Size: 11
-; CHECK-NEXT:     Offset: 1317
+; CHECK-NEXT:     Offset: 1330
 ; CHECK-NEXT:     Name: target_features
 ; CHECK-NEXT:   }
 ; CHECK-NEXT: ]
diff --git a/llvm/test/MC/WebAssembly/export-name.s b/llvm/test/MC/WebAssembly/export-name.s
index 6923b43f31af6..7e74bdd11d8d9 100644
--- a/llvm/test/MC/WebAssembly/export-name.s
+++ b/llvm/test/MC/WebAssembly/export-name.s
@@ -48,6 +48,7 @@ mid?question:
 
 # CHECK-OBJ:          Name:            linking
 # CHECK-OBJ-NEXT:     Version:         2
+# CHECK-OBJ-NEXT:     TargetArch:      wasm32
 # CHECK-OBJ-NEXT:     SymbolTable:
 # CHECK-OBJ-NEXT:       - Index:           0
 # CHECK-OBJ-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/function-sections.ll b/llvm/test/MC/WebAssembly/function-sections.ll
index 9c10cace404f2..f4729daf96c70 100644
--- a/llvm/test/MC/WebAssembly/function-sections.ll
+++ b/llvm/test/MC/WebAssembly/function-sections.ll
@@ -15,6 +15,7 @@ entry:
 ; CHECK:        - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     Version:         2
+; CHECK-NEXT:     TargetArch:      wasm32
 ; CHECK-NEXT:     SymbolTable:
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/global-ctor-dtor.ll b/llvm/test/MC/WebAssembly/global-ctor-dtor.ll
index f1ec71da1ebb6..df46a1c65657c 100644
--- a/llvm/test/MC/WebAssembly/global-ctor-dtor.ll
+++ b/llvm/test/MC/WebAssembly/global-ctor-dtor.ll
@@ -114,6 +114,7 @@ declare void @func3()
 ; CHECK-NEXT:   - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     Version:         2
+; CHECK-NEXT:     TargetArch:      wasm32
 ; CHECK-NEXT:     SymbolTable:
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/globals.s b/llvm/test/MC/WebAssembly/globals.s
index b7e25cb9f0519..dca55863f08ce 100644
--- a/llvm/test/MC/WebAssembly/globals.s
+++ b/llvm/test/MC/WebAssembly/globals.s
@@ -55,6 +55,7 @@ global4:
 #      BIN:  - Type:            CUSTOM
 # BIN-NEXT:    Name:            linking
 # BIN-NEXT:    Version:         2
+# BIN-NEXT:    TargetArch:      wasm32
 # BIN-NEXT:    SymbolTable:
 # BIN-NEXT:      - Index:           0
 # BIN-NEXT:        Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/init-array-label.s b/llvm/test/MC/WebAssembly/init-array-label.s
index 0b4a5ea2da0b5..4d2e77807f75e 100644
--- a/llvm/test/MC/WebAssembly/init-array-label.s
+++ b/llvm/test/MC/WebAssembly/init-array-label.s
@@ -50,6 +50,7 @@ p_init2:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/init-array.s b/llvm/test/MC/WebAssembly/init-array.s
index e79fb453ec12a..785d0c2942937 100644
--- a/llvm/test/MC/WebAssembly/init-array.s
+++ b/llvm/test/MC/WebAssembly/init-array.s
@@ -29,6 +29,7 @@ init2:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/reloc-pic.s b/llvm/test/MC/WebAssembly/reloc-pic.s
index 32c7de775e331..638ebfa3dcc4b 100644
--- a/llvm/test/MC/WebAssembly/reloc-pic.s
+++ b/llvm/test/MC/WebAssembly/reloc-pic.s
@@ -159,6 +159,7 @@ REF-.tabletype mytable, externref
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/reloc-pic64.s b/llvm/test/MC/WebAssembly/reloc-pic64.s
index 743bba33749bd..ce16d88d14e09 100644
--- a/llvm/test/MC/WebAssembly/reloc-pic64.s
+++ b/llvm/test/MC/WebAssembly/reloc-pic64.s
@@ -162,6 +162,7 @@ hidden_func:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm64
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/tables.s b/llvm/test/MC/WebAssembly/tables.s
index 8239432eed88d..0ed8012e6eaac 100644
--- a/llvm/test/MC/WebAssembly/tables.s
+++ b/llvm/test/MC/WebAssembly/tables.s
@@ -179,6 +179,7 @@ table_fill:
 #      BIN:  - Type:            CUSTOM
 # BIN-NEXT:    Name:            linking
 # BIN-NEXT:    Version:         2
+# BIN-NEXT:    TargetArch:      wasm32
 # BIN-NEXT:    SymbolTable:
 # BIN-NEXT:      - Index:           0
 # BIN-NEXT:        Kind:            TABLE
diff --git a/llvm/test/MC/WebAssembly/tag-section.s b/llvm/test/MC/WebAssembly/tag-section.s
index 40339c5fa3f37..acaf5fe8d073d 100644
--- a/llvm/test/MC/WebAssembly/tag-section.s
+++ b/llvm/test/MC/WebAssembly/tag-section.s
@@ -50,6 +50,7 @@ my_exception:
 # CHECK:        - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 
 # CHECK:            - Index:           1
diff --git a/llvm/test/MC/WebAssembly/tls.s b/llvm/test/MC/WebAssembly/tls.s
index 340cd5ac6a183..cb58e434a2d96 100644
--- a/llvm/test/MC/WebAssembly/tls.s
+++ b/llvm/test/MC/WebAssembly/tls.s
@@ -50,6 +50,7 @@ tls2:
 #      CHECK-OBJ:  - Type:            CUSTOM
 # CHECK-OBJ-NEXT:    Name:            linking
 # CHECK-OBJ-NEXT:    Version:         2
+# CHECK-OBJ-NEXT:    TargetArch:      wasm32
 # CHECK-OBJ-NEXT:    SymbolTable:
 # CHECK-OBJ-NEXT:      - Index:           0
 # CHECK-OBJ-NEXT:        Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/tls64.s b/llvm/test/MC/WebAssembly/tls64.s
index 9d6dd5a0f729a..20547bbfd733f 100644
--- a/llvm/test/MC/WebAssembly/tls64.s
+++ b/llvm/test/MC/WebAssembly/tls64.s
@@ -42,6 +42,7 @@ tls2:
 #      CHECK-OBJ:  - Type:            CUSTOM
 # CHECK-OBJ-NEXT:    Name:            linking
 # CHECK-OBJ-NEXT:    Version:         2
+# CHECK-OBJ-NEXT:    TargetArch:      wasm64
 # CHECK-OBJ-NEXT:    SymbolTable:
 # CHECK-OBJ-NEXT:      - Index:           0
 # CHECK-OBJ-NEXT:        Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/type-index.s b/llvm/test/MC/WebAssembly/type-index.s
index 1c2feeda3e870..1439d688c58a1 100644
--- a/llvm/test/MC/WebAssembly/type-index.s
+++ b/llvm/test/MC/WebAssembly/type-index.s
@@ -65,6 +65,7 @@ test0:
 # BIN-NEXT:   - Type:            CUSTOM
 # BIN-NEXT:     Name:            linking
 # BIN-NEXT:     Version:         2
+# BIN-NEXT:     TargetArch:      wasm32
 # BIN-NEXT:     SymbolTable:
 # BIN-NEXT:       - Index:           0
 # BIN-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/MC/WebAssembly/unnamed-data.ll b/llvm/test/MC/WebAssembly/unnamed-data.ll
index 0887622277bb3..3e422ee9d759c 100644
--- a/llvm/test/MC/WebAssembly/unnamed-data.ll
+++ b/llvm/test/MC/WebAssembly/unnamed-data.ll
@@ -45,6 +45,7 @@ target triple = "wasm32-unknown-unknown"
 ; CHECK-NEXT:   - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     Version:         2
+; CHECK-NEXT:     TargetArch:      wasm32
 ; CHECK-NEXT:     SymbolTable:
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Kind:            DATA
@@ -87,4 +88,4 @@ target triple = "wasm32-unknown-unknown"
 ; CHECK-NEXT:         Name:        .data.b
 ; CHECK-NEXT:         Alignment:   3
 ; CHECK-NEXT:         Flags:       [ ]
-; CHECK-NEXT:   ...
+; CHECK-NEXT: ...
diff --git a/llvm/test/MC/WebAssembly/wasm64.s b/llvm/test/MC/WebAssembly/wasm64.s
index 4b572a43c65d7..ec81f0aaad387 100644
--- a/llvm/test/MC/WebAssembly/wasm64.s
+++ b/llvm/test/MC/WebAssembly/wasm64.s
@@ -218,6 +218,7 @@ test:
 # BIN-NEXT:   - Type:            CUSTOM
 # BIN-NEXT:     Name:            linking
 # BIN-NEXT:     Version:         2
+# BIN-NEXT:     TargetArch:      wasm64
 # BIN-NEXT:     SymbolTable:
 # BIN-NEXT:       - Index:           0
 # BIN-NEXT:         Kind:            TABLE
diff --git a/llvm/test/MC/WebAssembly/weak-alias.s b/llvm/test/MC/WebAssembly/weak-alias.s
index 6c4887034bd39..c05e501911ca7 100644
--- a/llvm/test/MC/WebAssembly/weak-alias.s
+++ b/llvm/test/MC/WebAssembly/weak-alias.s
@@ -174,6 +174,7 @@ alias_address:
 # CHECK-NEXT:   - Type:            CUSTOM
 # CHECK-NEXT:     Name:            linking
 # CHECK-NEXT:     Version:         2
+# CHECK-NEXT:     TargetArch:      wasm32
 # CHECK-NEXT:     SymbolTable:
 # CHECK-NEXT:       - Index:           0
 # CHECK-NEXT:         Kind:            FUNCTION
@@ -347,6 +348,7 @@ alias_address:
 # REF-NEXT:   - Type:            CUSTOM
 # REF-NEXT:     Name:            linking
 # REF-NEXT:     Version:         2
+# REF-NEXT:     TargetArch:      wasm32
 # REF-NEXT:     SymbolTable:
 # REF-NEXT:       - Index:           0
 # REF-NEXT:         Kind:            FUNCTION
diff --git a/llvm/test/ObjectYAML/wasm/dylink_section.yaml b/llvm/test/ObjectYAML/wasm/dylink_section.yaml
index fa8d1d67bb397..6883d2cfe80d5 100644
--- a/llvm/test/ObjectYAML/wasm/dylink_section.yaml
+++ b/llvm/test/ObjectYAML/wasm/dylink_section.yaml
@@ -6,6 +6,7 @@ FileHeader:
 Sections:
   - Type:            CUSTOM
     Name:            dylink.0
+    TargetArch:      wasm32
     MemorySize:      4
     MemoryAlignment: 2
     TableSize:       1
@@ -19,6 +20,7 @@ Sections:
 # CHECK: Sections:
 # CHECK:   - Type:            CUSTOM
 # CHECK:     Name:            dylink.0
+# CHECK:     TargetArch:      wasm32
 # CHECK:     MemorySize:      4
 # CHECK:     MemoryAlignment: 2
 # CHECK:     TableSize:       1
diff --git a/llvm/test/ObjectYAML/wasm/linking_section.yaml b/llvm/test/ObjectYAML/wasm/linking_section.yaml
index 2e3da8791c7bb..e6401d0685e65 100644
--- a/llvm/test/ObjectYAML/wasm/linking_section.yaml
+++ b/llvm/test/ObjectYAML/wasm/linking_section.yaml
@@ -31,6 +31,7 @@ Sections:
   - Type:            CUSTOM
     Name:            linking
     Version:         2
+    TargetArch:      wasm32
     SymbolTable:
       - Index:           0
         Kind:            FUNCTION
@@ -50,7 +51,10 @@ Sections:
       - Priority:      1
         Symbol:        0
 ...
-# CHECK:         SymbolTable:
+# CHECK:         Name:            linking
+# CHECK-NEXT:    Version:         2
+# CHECK-NEXT:    TargetArch:      wasm32
+# CHECK-NEXT:    SymbolTable:
 # CHECK-NEXT:      - Index:           0
 # CHECK-NEXT:        Kind:            FUNCTION
 # CHECK-NEXT:        Name:            bar
diff --git a/llvm/tools/obj2yaml/wasm2yaml.cpp b/llvm/tools/obj2yaml/wasm2yaml.cpp
index 2db5387b1ec6c..990709f331cfb 100644
--- a/llvm/tools/obj2yaml/wasm2yaml.cpp
+++ b/llvm/tools/obj2yaml/wasm2yaml.cpp
@@ -67,6 +67,7 @@ WasmDumper::dumpCustomSection(const WasmSection &WasmSec) {
       DylinkSec->ImportInfo.push_back({Imp.Module, Imp.Field, Imp.Flags});
     for (const auto &Exp : Info.ExportInfo)
       DylinkSec->ExportInfo.push_back({Exp.Name, Exp.Flags});
+    DylinkSec->TargetArch = Info.TargetArch;
     CustomSec = std::move(DylinkSec);
   } else if (WasmSec.Name == "name") {
     std::unique_ptr<WasmYAML::NameSection> NameSec =
@@ -160,6 +161,7 @@ WasmDumper::dumpCustomSection(const WasmSection &WasmSec) {
       LinkingSec->InitFunctions.emplace_back(F);
     }
 
+    LinkingSec->TargetArch = Obj.linkingData().TargetArch;
     CustomSec = std::move(LinkingSec);
   } else if (WasmSec.Name == "producers") {
     std::unique_ptr<WasmYAML::ProducersSection> ProducersSec =



More information about the llvm-commits mailing list