Index: llvm/trunk/lib/MC/WasmObjectWriter.cpp =================================================================== --- llvm/trunk/lib/MC/WasmObjectWriter.cpp +++ llvm/trunk/lib/MC/WasmObjectWriter.cpp @@ -1024,6 +1024,9 @@ Imports.push_back(Import); WasmIndices[&WS] = NumFunctionImports++; } else if (WS.isGlobal()) { + if (WS.isWeak()) + report_fatal_error("undefined global symbol cannot be weak"); + wasm::WasmImport Import; Import.Module = WS.getModuleName(); Import.Field = WS.getName(); Index: llvm/trunk/lib/Object/WasmObjectFile.cpp =================================================================== --- llvm/trunk/lib/Object/WasmObjectFile.cpp +++ llvm/trunk/lib/Object/WasmObjectFile.cpp @@ -422,6 +422,11 @@ IsDefined != isDefinedGlobalIndex(Info.ElementIndex)) return make_error("invalid global symbol index", object_error::parse_failed); + if (!IsDefined && + (Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) == + wasm::WASM_SYMBOL_BINDING_WEAK) + return make_error("undefined weak global symbol", + object_error::parse_failed); if (IsDefined) { Info.Name = readString(Ptr); unsigned GlobalIndex = Info.ElementIndex - NumImportedGlobals; Index: llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml +++ llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml @@ -0,0 +1,24 @@ +# RUN: yaml2obj < %s | not obj2yaml 2>&1 | FileCheck %s + +--- !WASM +FileHeader: + Version: 0x00000001 +Sections: + - Type: IMPORT + Imports: + - Module: fiz + Field: imported_global + Kind: GLOBAL + GlobalType: I32 + GlobalMutable: false + - Type: CUSTOM + Name: linking + SymbolTable: + - Index: 0 + Kind: GLOBAL + Name: imported_global + Flags: [ BINDING_WEAK, UNDEFINED ] + Global: 0 +... + +# CHECK: Error reading file: : undefined weak global symbol Index: llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml =================================================================== --- llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml +++ llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml @@ -18,16 +18,11 @@ Field: weak_import_func Kind: FUNCTION SigIndex: 0 - - Module: env - Field: weak_import_global - Kind: GLOBAL - GlobalType: I32 - GlobalMutable: false - Type: FUNCTION FunctionTypes: [ 0 ] - Type: GLOBAL Globals: - - Index: 1 + - Index: 0 Type: I32 Mutable: false InitExpr: @@ -64,7 +59,7 @@ Kind: GLOBAL Name: weak_defined_global Flags: [ BINDING_WEAK ] - Global: 1 + Global: 0 - Index: 3 Kind: DATA Name: weak_import_data @@ -74,11 +69,6 @@ Name: weak_import_func Flags: [ BINDING_WEAK, UNDEFINED ] Function: 0 - - Index: 5 - Kind: GLOBAL - Name: weak_import_global - Flags: [ BINDING_WEAK, UNDEFINED ] - Global: 0 SegmentInfo: - Index: 0 Name: .rodata.constantData @@ -88,7 +78,6 @@ # CHECK: 00000000 W weak_defined_data # CHECK-NEXT: 00000001 W weak_defined_func -# CHECK-NEXT: 00000001 W weak_defined_global +# CHECK-NEXT: 00000000 W weak_defined_global # CHECK-NEXT: w weak_import_data # CHECK-NEXT: w weak_import_func -# CHECK-NEXT: w weak_import_global