[WebAssembly] Reorder symbol table to match MC order

This removes a TODO introduced in rL325860

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

llvm-svn: 326334
This commit is contained in:
Nicholas Wilson 2018-02-28 17:19:48 +00:00
parent 512f7ee315
commit 586320c075
10 changed files with 126 additions and 127 deletions

View File

@ -974,32 +974,8 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
SmallVector<wasm::WasmSymbolInfo, 4> SymbolInfos;
SmallVector<std::pair<uint16_t, uint32_t>, 2> InitFuncs;
std::map<StringRef, std::vector<WasmComdatEntry>> Comdats;
unsigned NumSymbols = 0;
uint32_t DataSize = 0;
auto AddSymbol = [&](const MCSymbolWasm &WS) {
uint32_t Flags = 0;
if (WS.isWeak())
Flags |= wasm::WASM_SYMBOL_BINDING_WEAK;
if (WS.isHidden())
Flags |= wasm::WASM_SYMBOL_VISIBILITY_HIDDEN;
if (!WS.isExternal() && WS.isDefined())
Flags |= wasm::WASM_SYMBOL_BINDING_LOCAL;
if (WS.isUndefined())
Flags |= wasm::WASM_SYMBOL_UNDEFINED;
wasm::WasmSymbolInfo Info;
Info.Name = WS.getName();
Info.Kind = WS.getType();
Info.Flags = Flags;
if (!WS.isData())
Info.ElementIndex = WasmIndices[&WS];
else if (WS.isDefined())
Info.DataRef = DataLocations[&WS];
SymbolInfos.emplace_back(Info);
SymbolIndices[&WS] = NumSymbols++;
};
// For now, always emit the memory import, since loads and stores are not
// valid without it. In the future, we could perhaps be more clever and omit
// it if there are no loads or stores.
@ -1023,7 +999,9 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
TableImport.Table.ElemType = wasm::WASM_TYPE_ANYFUNC;
Imports.push_back(TableImport);
// Populate FunctionTypeIndices and Imports.
// Populate FunctionTypeIndices, and Imports and WasmIndices for undefined
// symbols. This must be done before populating WasmIndices for defined
// symbols.
for (const MCSymbol &S : Asm.symbols()) {
const auto &WS = static_cast<const MCSymbolWasm &>(S);
@ -1054,17 +1032,10 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
Imports.push_back(Import);
WasmIndices[&WS] = NumGlobalImports++;
}
// TODO(ncw) We shouldn't be adding the symbol to the symbol table here!
// Instead it should be done by removing the "if (WS.isDefined())" block
// in the big loop below (line ~1284). However - that would reorder all
// the symbols and thus require all the tests to be updated. I think it's
// better to make that change therefore in a future commit, to isolate
// each test update from the change that caused it.
AddSymbol(WS);
}
}
// Populate DataSegments, which must be done before populating DataLocations.
for (MCSection &Sec : Asm) {
auto &Section = static_cast<MCSectionWasm &>(Sec);
if (!Section.isWasmData())
@ -1093,7 +1064,7 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
}
}
// Handle regular defined and undefined symbols.
// Populate WasmIndices and DataLocations for defined symbols.
for (const MCSymbol &S : Asm.symbols()) {
// Ignore unnamed temporary symbols, which aren't ever exported, imported,
// or used in relocations.
@ -1182,14 +1153,12 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
DEBUG(dbgs() << " -> global index: " << WasmIndices.find(&WS)->second
<< "\n");
}
if (WS.isDefined())
AddSymbol(WS);
}
// Handle weak aliases. We need to process these in a separate pass because
// we need to have processed the target of the alias before the alias itself
// and the symbols are not necessarily ordered in this way.
// Populate WasmIndices and DataLocations for aliased symbols. We need to
// process these in a separate pass because we need to have processed the
// target of the alias before the alias itself and the symbols are not
// necessarily ordered in this way.
for (const MCSymbol &S : Asm.symbols()) {
if (!S.isVariable())
continue;
@ -1215,8 +1184,38 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
} else {
report_fatal_error("don't yet support global aliases");
}
}
AddSymbol(WS);
// Finally, populate the symbol table itself, in its "natural" order.
for (const MCSymbol &S : Asm.symbols()) {
const auto &WS = static_cast<const MCSymbolWasm &>(S);
if (WS.isTemporary() && WS.getName().empty())
continue;
if (WS.isComdat() && !WS.isDefined())
continue;
if (WS.isTemporary() && WS.isData() && !WS.getSize())
continue;
uint32_t Flags = 0;
if (WS.isWeak())
Flags |= wasm::WASM_SYMBOL_BINDING_WEAK;
if (WS.isHidden())
Flags |= wasm::WASM_SYMBOL_VISIBILITY_HIDDEN;
if (!WS.isExternal() && WS.isDefined())
Flags |= wasm::WASM_SYMBOL_BINDING_LOCAL;
if (WS.isUndefined())
Flags |= wasm::WASM_SYMBOL_UNDEFINED;
wasm::WasmSymbolInfo Info;
Info.Name = WS.getName();
Info.Kind = WS.getType();
Info.Flags = Flags;
if (!WS.isData())
Info.ElementIndex = WasmIndices.find(&WS)->second;
else if (WS.isDefined())
Info.DataRef = DataLocations.find(&WS)->second;
SymbolIndices[&WS] = SymbolInfos.size();
SymbolInfos.emplace_back(Info);
}
{

View File

@ -53,7 +53,7 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) {
; CHECK-NEXT: - Type: CODE
; CHECK-NEXT: Relocations:
; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Index: 1
; CHECK-NEXT: Offset: 0x00000004
; CHECK-NEXT: Functions:
; CHECK-NEXT: - Index: 1
@ -78,14 +78,14 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) {
; CHECK-NEXT: SymbolTable:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: funcImport
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 0
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: callImport
; CHECK-NEXT: Flags: [ ]
; CHECK-NEXT: Function: 1
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: funcImport
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 0
; CHECK-NEXT: - Index: 2
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: basicInlineFn

View File

@ -13,7 +13,7 @@ target triple = "wasm32-unknown-unknown-wasm"
; CHECK: - Type: DATA
; CHECK-NEXT: Relocations:
; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_I32
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Index: 2
; CHECK-NEXT: Offset: 0x00000013
; CHECK-NEXT: Segments:
; CHECK-NEXT: - SectionOffset: 6

View File

@ -44,5 +44,5 @@ declare void @f1(i32) #1
; CHECK: - Type: DATA
; CHECK-NEXT: Relocations:
; CHECK-NEXT: - Type: R_WEBASSEMBLY_TABLE_INDEX_I32
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Index: 1
; CHECK-NEXT: Offset: 0x00000006

View File

@ -34,16 +34,16 @@ entry:
; CHECK: Relocation {
; CHECK: Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB (0)
; CHECK: Offset: 0x4
; CHECK: Index: 0x0
; CHECK: Index: 0x1
; CHECK: }
; CHECK: Relocation {
; CHECK: Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB (0)
; CHECK: Offset: 0xB
; CHECK: Index: 0x1
; CHECK: Index: 0x2
; CHECK: }
; CHECK: Relocation {
; CHECK: Type: R_WEBASSEMBLY_TABLE_INDEX_SLEB (1)
; CHECK: Offset: 0x1E
; CHECK: Index: 0x3
; CHECK: Index: 0x5
; CHECK: }
; CHECK: }

View File

@ -64,28 +64,28 @@ declare void @func3()
; CHECK-NEXT: - Type: CODE
; CHECK-NEXT: Relocations:
; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Index: 1
; CHECK-NEXT: Offset: 0x00000004
; CHECK-NEXT: - Type: R_WEBASSEMBLY_TABLE_INDEX_SLEB
; CHECK-NEXT: Index: 6
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Offset: 0x0000000F
; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_SLEB
; CHECK-NEXT: Index: 1
; CHECK-NEXT: Index: 3
; CHECK-NEXT: Offset: 0x00000017
; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB
; CHECK-NEXT: Index: 2
; CHECK-NEXT: Index: 4
; CHECK-NEXT: Offset: 0x0000001D
; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB
; CHECK-NEXT: Index: 3
; CHECK-NEXT: Index: 6
; CHECK-NEXT: Offset: 0x0000002C
; CHECK-NEXT: - Type: R_WEBASSEMBLY_TABLE_INDEX_SLEB
; CHECK-NEXT: Index: 8
; CHECK-NEXT: Index: 5
; CHECK-NEXT: Offset: 0x00000037
; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_SLEB
; CHECK-NEXT: Index: 1
; CHECK-NEXT: Index: 3
; CHECK-NEXT: Offset: 0x0000003F
; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB
; CHECK-NEXT: Index: 2
; CHECK-NEXT: Index: 4
; CHECK-NEXT: Offset: 0x00000045
; CHECK-NEXT: Functions:
; CHECK-NEXT: - Index: 5
@ -113,71 +113,71 @@ declare void @func3()
; CHECK-NEXT: SymbolTable:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func3
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 0
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: __dso_handle
; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN, UNDEFINED ]
; CHECK-NEXT: - Index: 2
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: __cxa_atexit
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 1
; CHECK-NEXT: - Index: 3
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func2
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 2
; CHECK-NEXT: - Index: 4
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func1
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 3
; CHECK-NEXT: - Index: 5
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func0
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 4
; CHECK-NEXT: - Index: 6
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: .Lcall_dtors.42
; CHECK-NEXT: Flags: [ BINDING_LOCAL ]
; CHECK-NEXT: Function: 5
; CHECK-NEXT: - Index: 7
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func3
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 0
; CHECK-NEXT: - Index: 2
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: .Lregister_call_dtors.42
; CHECK-NEXT: Flags: [ BINDING_LOCAL ]
; CHECK-NEXT: Function: 6
; CHECK-NEXT: - Index: 8
; CHECK-NEXT: - Index: 3
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: __dso_handle
; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN, UNDEFINED ]
; CHECK-NEXT: - Index: 4
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: __cxa_atexit
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 1
; CHECK-NEXT: - Index: 5
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: .Lcall_dtors
; CHECK-NEXT: Flags: [ BINDING_LOCAL ]
; CHECK-NEXT: Function: 7
; CHECK-NEXT: - Index: 9
; CHECK-NEXT: - Index: 6
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func2
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 2
; CHECK-NEXT: - Index: 7
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: .Lregister_call_dtors
; CHECK-NEXT: Flags: [ BINDING_LOCAL ]
; CHECK-NEXT: Function: 8
; CHECK-NEXT: - Index: 10
; CHECK-NEXT: - Index: 8
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: global1
; CHECK-NEXT: Flags: [ ]
; CHECK-NEXT: Segment: 0
; CHECK-NEXT: Size: 4
; CHECK-NEXT: SegmentInfo:
; CHECK-NEXT: - Index: 9
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func1
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 3
; CHECK-NEXT: - Index: 10
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: func0
; CHECK-NEXT: Flags: [ UNDEFINED ]
; CHECK-NEXT: Function: 4
; CHECK-NEXT: SegmentInfo:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Name: .data.global1
; CHECK-NEXT: Alignment: 8
; CHECK-NEXT: Flags: [ ]
; CHECK-NEXT: InitFunctions:
; CHECK-NEXT: - Priority: 42
; CHECK-NEXT: Symbol: 4
; CHECK-NEXT: - Priority: 42
; CHECK-NEXT: Symbol: 7
; CHECK-NEXT: - Priority: 65535
; CHECK-NEXT: Symbol: 5
; CHECK-NEXT: - Priority: 65535
; CHECK-NEXT: Symbol: 9
; CHECK-NEXT: - Priority: 42
; CHECK-NEXT: Symbol: 2
; CHECK-NEXT: - Priority: 65535
; CHECK-NEXT: Symbol: 10
; CHECK-NEXT: - Priority: 65535
; CHECK-NEXT: Symbol: 7
; CHECK-NEXT: ...

View File

@ -28,13 +28,13 @@ entry:
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_MEMORY_ADDR_LEB (3)
; CHECK-NEXT: Offset: 0x9
; CHECK-NEXT: Index: 0x3
; CHECK-NEXT: Index: 0x1
; CHECK-NEXT: Addend: 0
; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_MEMORY_ADDR_LEB (3)
; CHECK-NEXT: Offset: 0x14
; CHECK-NEXT: Index: 0x4
; CHECK-NEXT: Index: 0x2
; CHECK-NEXT: Addend: 0
; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
@ -50,12 +50,12 @@ entry:
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB (0)
; CHECK-NEXT: Offset: 0x2D
; CHECK-NEXT: Index: 0x0
; CHECK-NEXT: Index: 0x3
; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB (0)
; CHECK-NEXT: Offset: 0x34
; CHECK-NEXT: Index: 0x1
; CHECK-NEXT: Index: 0x4
; CHECK-NEXT: }
; CHECK-NEXT: }
; CHECK-NEXT: ]

View File

@ -17,31 +17,31 @@ target triple = "wasm32-unknown-unknown-wasm"
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_MEMORY_ADDR_I32 (5)
; CHECK-NEXT: Offset: 0x13
; CHECK-NEXT: Index: 0x0
; CHECK-NEXT: Index: 0x2
; CHECK-NEXT: Addend: 8
; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_MEMORY_ADDR_I32 (5)
; CHECK-NEXT: Offset: 0x1C
; CHECK-NEXT: Index: 0x1
; CHECK-NEXT: Index: 0x0
; CHECK-NEXT: Addend: -16
; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_MEMORY_ADDR_I32 (5)
; CHECK-NEXT: Offset: 0x25
; CHECK-NEXT: Index: 0x0
; CHECK-NEXT: Index: 0x2
; CHECK-NEXT: Addend: 0
; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_MEMORY_ADDR_I32 (5)
; CHECK-NEXT: Offset: 0x29
; CHECK-NEXT: Index: 0x0
; CHECK-NEXT: Index: 0x2
; CHECK-NEXT: Addend: 0
; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Type: R_WEBASSEMBLY_MEMORY_ADDR_I32 (5)
; CHECK-NEXT: Offset: 0x2D
; CHECK-NEXT: Index: 0x0
; CHECK-NEXT: Index: 0x2
; CHECK-NEXT: Addend: 0
; CHECK-NEXT: }
; CHECK-NEXT: }

View File

@ -79,16 +79,16 @@ entry:
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Offset: 0x00000009
; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB
; CHECK-NEXT: Index: 8
; CHECK-NEXT: Index: 3
; CHECK-NEXT: Offset: 0x00000012
; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_LEB
; CHECK-NEXT: Index: 4
; CHECK-NEXT: Index: 5
; CHECK-NEXT: Offset: 0x0000001E
; CHECK-NEXT: - Type: R_WEBASSEMBLY_TYPE_INDEX_LEB
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Offset: 0x00000024
; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_LEB
; CHECK-NEXT: Index: 6
; CHECK-NEXT: Index: 7
; CHECK-NEXT: Offset: 0x00000031
; CHECK-NEXT: - Type: R_WEBASSEMBLY_TYPE_INDEX_LEB
; CHECK-NEXT: Index: 0
@ -115,7 +115,7 @@ entry:
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Offset: 0x0000000F
; CHECK-NEXT: - Type: R_WEBASSEMBLY_TABLE_INDEX_I32
; CHECK-NEXT: Index: 8
; CHECK-NEXT: Index: 3
; CHECK-NEXT: Offset: 0x00000018
; CHECK-NEXT: Segments:
; CHECK-NEXT: - SectionOffset: 6
@ -156,37 +156,37 @@ entry:
; CHECK-NEXT: Function: 2
; CHECK-NEXT: - Index: 3
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: foo_alias
; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ]
; CHECK-NEXT: Function: 0
; CHECK-NEXT: - Index: 4
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: call_direct_ptr
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
; CHECK-NEXT: Function: 3
; CHECK-NEXT: - Index: 4
; CHECK-NEXT: - Index: 5
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: direct_address
; CHECK-NEXT: Flags: [ ]
; CHECK-NEXT: Segment: 1
; CHECK-NEXT: Size: 4
; CHECK-NEXT: - Index: 5
; CHECK-NEXT: - Index: 6
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: call_alias_ptr
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
; CHECK-NEXT: Function: 4
; CHECK-NEXT: - Index: 6
; CHECK-NEXT: - Index: 7
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: alias_address
; CHECK-NEXT: Flags: [ ]
; CHECK-NEXT: Segment: 2
; CHECK-NEXT: Size: 4
; CHECK-NEXT: - Index: 7
; CHECK-NEXT: - Index: 8
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: bar
; CHECK-NEXT: Flags: [ ]
; CHECK-NEXT: Segment: 0
; CHECK-NEXT: Size: 4
; CHECK-NEXT: - Index: 8
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: foo_alias
; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ]
; CHECK-NEXT: Function: 0
; CHECK-NEXT: - Index: 9
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: bar_alias
@ -212,10 +212,10 @@ entry:
; CHECK-SYMS-NEXT: 00000000 g F CODE .hidden foo
; CHECK-SYMS-NEXT: 00000001 g F CODE .hidden call_direct
; CHECK-SYMS-NEXT: 00000002 g F CODE .hidden call_alias
; CHECK-SYMS-NEXT: 00000000 gw F CODE .hidden foo_alias
; CHECK-SYMS-NEXT: 00000003 g F CODE .hidden call_direct_ptr
; CHECK-SYMS-NEXT: 00000008 g DATA direct_address
; CHECK-SYMS-NEXT: 00000004 g F CODE .hidden call_alias_ptr
; CHECK-SYMS-NEXT: 00000010 g DATA alias_address
; CHECK-SYMS-NEXT: 00000000 g DATA bar
; CHECK-SYMS-NEXT: 00000000 gw F CODE .hidden foo_alias
; CHECK-SYMS-NEXT: 00000000 gw DATA .hidden bar_alias

View File

@ -24,12 +24,12 @@ entry:
; CHECK-NEXT: Name: linking
; CHECK-NEXT: SymbolTable:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: weak_external_data
; CHECK-NEXT: Flags: [ BINDING_WEAK, UNDEFINED ]
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Name: weak_function
; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ]
; CHECK-NEXT: Function: 0
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Kind: DATA
; CHECK-NEXT: Name: weak_external_data
; CHECK-NEXT: Flags: [ BINDING_WEAK, UNDEFINED ]
; CHECK-NEXT: ...