mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[WebAssembly] MC: Handle aliases of aliases
Differential Revision: https://reviews.llvm.org/D58417 llvm-svn: 354694
This commit is contained in:
parent
c8d9305d8b
commit
a3d97c3207
@ -558,12 +558,13 @@ void WasmObjectWriter::recordRelocation(MCAssembler &Asm,
|
||||
}
|
||||
|
||||
static const MCSymbolWasm *resolveSymbol(const MCSymbolWasm &Symbol) {
|
||||
if (Symbol.isVariable()) {
|
||||
const MCExpr *Expr = Symbol.getVariableValue();
|
||||
const MCSymbolWasm* Ret = &Symbol;
|
||||
while (Ret->isVariable()) {
|
||||
const MCExpr *Expr = Ret->getVariableValue();
|
||||
auto *Inner = cast<MCSymbolRefExpr>(Expr);
|
||||
return cast<MCSymbolWasm>(&Inner->getSymbol());
|
||||
Ret = cast<MCSymbolWasm>(&Inner->getSymbol());
|
||||
}
|
||||
return &Symbol;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
// Compute a value to write into the code at the location covered
|
||||
@ -1422,12 +1423,12 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
LLVM_DEBUG(dbgs() << WS.getName() << ": weak alias of '" << *ResolvedSym
|
||||
<< "'\n");
|
||||
|
||||
if (WS.isFunction()) {
|
||||
if (ResolvedSym->isFunction()) {
|
||||
assert(WasmIndices.count(ResolvedSym) > 0);
|
||||
uint32_t WasmIndex = WasmIndices.find(ResolvedSym)->second;
|
||||
WasmIndices[&WS] = WasmIndex;
|
||||
LLVM_DEBUG(dbgs() << " -> index:" << WasmIndex << "\n");
|
||||
} else if (WS.isData()) {
|
||||
} else if (ResolvedSym->isData()) {
|
||||
assert(DataLocations.count(ResolvedSym) > 0);
|
||||
const wasm::WasmDataReference &Ref =
|
||||
DataLocations.find(ResolvedSym)->second;
|
||||
|
@ -5,8 +5,10 @@ target triple = "wasm32-unknown-unknown-wasm"
|
||||
|
||||
@foo = alias i8, bitcast (i8* ()* @func to i8*)
|
||||
@bar = alias i8* (), i8* ()* @func
|
||||
@bar2 = alias i8* (), i8* ()* @bar
|
||||
|
||||
define i8* @func() {
|
||||
call i8* @bar2();
|
||||
ret i8* @foo;
|
||||
}
|
||||
|
||||
@ -19,6 +21,13 @@ define i8* @func() {
|
||||
; CHECK-NEXT: ElementIndex: 0x0
|
||||
; CHECK-NEXT: }
|
||||
; CHECK-NEXT: Symbol {
|
||||
; CHECK-NEXT: Name: bar2
|
||||
; CHECK-NEXT: Type: FUNCTION (0x0)
|
||||
; CHECK-NEXT: Flags [ (0x0)
|
||||
; CHECK-NEXT: ]
|
||||
; CHECK-NEXT: ElementIndex: 0x0
|
||||
; CHECK-NEXT: }
|
||||
; CHECK-NEXT: Symbol {
|
||||
; CHECK-NEXT: Name: foo
|
||||
; CHECK-NEXT: Type: FUNCTION (0x0)
|
||||
; CHECK-NEXT: Flags [ (0x0)
|
||||
|
Loading…
Reference in New Issue
Block a user