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).
Этот коммит содержится в:
родитель
33f76d1c2e
коммит
2fd8f103ab
1 изменённых файлов: 9 добавлений и 3 удалений
|
@ -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()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче