mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-07 04:23:41 +00:00
transform: fix func lowering assertion failure
The func-lowering pass has started to fail in the dev branch, probably as a result of replacing the ConstPropagation pass with the IPSCCP pass. This commit makes the code a bit more robust and should be able to handle all possible cases (not just ptrtoint).
This commit is contained in:
committed by
Ron Evans
parent
33f76d1c2e
commit
2fd8f103ab
@@ -118,12 +118,18 @@ func LowerFuncValues(mod llvm.Module) {
|
||||
continue
|
||||
}
|
||||
for _, funcValueWithSignatureGlobal := range getUses(funcValueWithSignatureConstant) {
|
||||
id := llvm.ConstInt(uintptrType, uint64(fn.id), false)
|
||||
for _, use := range getUses(funcValueWithSignatureGlobal) {
|
||||
if ptrtoint.IsAConstantExpr().IsNil() || ptrtoint.Opcode() != llvm.PtrToInt {
|
||||
panic("expected const ptrtoint")
|
||||
// Try to replace uses directly: most will be
|
||||
// ptrtoint instructions.
|
||||
if !use.IsAConstantExpr().IsNil() && use.Opcode() == llvm.PtrToInt {
|
||||
use.ReplaceAllUsesWith(id)
|
||||
}
|
||||
use.ReplaceAllUsesWith(llvm.ConstInt(uintptrType, uint64(fn.id), false))
|
||||
}
|
||||
// Remaining uses can be replaced using a ptrtoint.
|
||||
// In my quick testing, this doesn't really happen in
|
||||
// practice.
|
||||
funcValueWithSignatureGlobal.ReplaceAllUsesWith(llvm.ConstIntToPtr(id, funcValueWithSignatureGlobal.Type()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user