@@ -1956,27 +1956,42 @@ std::pair<llvm::Value *, llvm::Value *> irgen::getAsyncFunctionAndSize(
1956
1956
{ // thin
1957
1957
IGF.Builder .emitBlock (thinBlock);
1958
1958
auto *ptr = functionPointer.getRawPointer ();
1959
- if (auto authInfo = functionPointer.getAuthInfo ()) {
1960
- ptr = emitPointerAuthAuth (IGF, ptr, authInfo);
1961
- }
1962
- auto *afpPtr =
1963
- IGF.Builder .CreateBitCast (ptr, IGF.IGM .AsyncFunctionPointerPtrTy );
1964
- if (emitFunction) {
1965
- llvm::Value *addrPtr = IGF.Builder .CreateStructGEP (afpPtr, 0 );
1966
- auto *uncastFnPtr = IGF.emitLoadOfRelativePointer (
1967
- Address (addrPtr, IGF.IGM .getPointerAlignment ()), /* isFar*/ false ,
1968
- /* expectedType*/ functionPointer.getFunctionType ()->getPointerTo ());
1969
- auto *fnPtr = IGF.Builder .CreateBitCast (uncastFnPtr, IGF.IGM .Int8PtrTy );
1959
+
1960
+ // If function pointer is a direct pointer to a function, it could not be
1961
+ // an async function pointer. And additive operation to function address is
1962
+ // illegal on some archs like wasm32, so emit undefs instead.
1963
+ if (isa<llvm::Function>(ptr)) {
1964
+ if (emitFunction) {
1965
+ auto *undef = llvm::UndefValue::get (IGF.IGM .Int8PtrTy );
1966
+ fnPhiValues.push_back ({thinBlock, undef});
1967
+ }
1968
+ if (emitSize) {
1969
+ auto *undef = llvm::UndefValue::get (IGF.IGM .Int32Ty );
1970
+ sizePhiValues.push_back ({thinBlock, undef});
1971
+ }
1972
+ } else {
1970
1973
if (auto authInfo = functionPointer.getAuthInfo ()) {
1971
- fnPtr = emitPointerAuthSign (IGF, fnPtr, authInfo);
1974
+ ptr = emitPointerAuthAuth (IGF, ptr, authInfo);
1975
+ }
1976
+ auto *afpPtr =
1977
+ IGF.Builder .CreateBitCast (ptr, IGF.IGM .AsyncFunctionPointerPtrTy );
1978
+ if (emitFunction) {
1979
+ llvm::Value *addrPtr = IGF.Builder .CreateStructGEP (afpPtr, 0 );
1980
+ auto *uncastFnPtr = IGF.emitLoadOfRelativePointer (
1981
+ Address (addrPtr, IGF.IGM .getPointerAlignment ()), /* isFar*/ false ,
1982
+ /* expectedType*/ functionPointer.getFunctionType ()->getPointerTo ());
1983
+ auto *fnPtr = IGF.Builder .CreateBitCast (uncastFnPtr, IGF.IGM .Int8PtrTy );
1984
+ if (auto authInfo = functionPointer.getAuthInfo ()) {
1985
+ fnPtr = emitPointerAuthSign (IGF, fnPtr, authInfo);
1986
+ }
1987
+ fnPhiValues.push_back ({thinBlock, fnPtr});
1988
+ }
1989
+ if (emitSize) {
1990
+ auto *sizePtr = IGF.Builder .CreateStructGEP (afpPtr, 1 );
1991
+ auto *size =
1992
+ IGF.Builder .CreateLoad (sizePtr, IGF.IGM .getPointerAlignment ());
1993
+ sizePhiValues.push_back ({thinBlock, size});
1972
1994
}
1973
- fnPhiValues.push_back ({thinBlock, fnPtr});
1974
- }
1975
- if (emitSize) {
1976
- auto *sizePtr = IGF.Builder .CreateStructGEP (afpPtr, 1 );
1977
- auto *size =
1978
- IGF.Builder .CreateLoad (sizePtr, IGF.IGM .getPointerAlignment ());
1979
- sizePhiValues.push_back ({thinBlock, size});
1980
1995
}
1981
1996
IGF.Builder .CreateBr (joinBlock);
1982
1997
}
0 commit comments