diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 3e2a74422b2e..9dac3d083994 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2483,7 +2483,8 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) { auto TII = MF->getTarget().getIntrinsicInfo(); const Function *F = CI.getCalledFunction(); - // FIXME: support Windows dllimport function calls. + // FIXME: support Windows dllimport function calls and calls through + // weak symbols. if (F && (F->hasDLLImportStorageClass() || (MF->getTarget().getTargetTriple().isOSWindows() && F->hasExternalWeakLinkage()))) @@ -2665,6 +2666,13 @@ bool IRTranslator::translateInvoke(const User &U, if (!isa(EHPadBB->getFirstNonPHI())) return false; + // FIXME: support Windows dllimport function calls and calls through + // weak symbols. + if (Fn && (Fn->hasDLLImportStorageClass() || + (MF->getTarget().getTargetTriple().isOSWindows() && + Fn->hasExternalWeakLinkage()))) + return false; + bool LowerInlineAsm = I.isInlineAsm(); bool NeedEHLabel = true; diff --git a/llvm/test/CodeGen/AArch64/dllimport.ll b/llvm/test/CodeGen/AArch64/dllimport.ll index 914f2ffbdb8b..014fff92787e 100644 --- a/llvm/test/CodeGen/AArch64/dllimport.ll +++ b/llvm/test/CodeGen/AArch64/dllimport.ll @@ -59,3 +59,45 @@ define i32 @call_internal() { ; DAG-ISEL: b internal ; FAST-ISEL: b internal ; GLOBAL-ISEL: b internal + +define void @call_try_catch() personality ptr @__gxx_personality_seh0 { +entry: + invoke void @myFunc() + to label %try.cont unwind label %lpad + +lpad: ; preds = %entry + %0 = landingpad { ptr, i32 } + catch ptr @_ZTIi + %1 = extractvalue { ptr, i32 } %0, 1 + %2 = tail call i32 @llvm.eh.typeid.for(ptr nonnull @_ZTIi) #1 + %matches = icmp eq i32 %1, %2 + br i1 %matches, label %catch, label %eh.resume + +catch: ; preds = %lpad + %3 = extractvalue { ptr, i32 } %0, 0 + %4 = tail call ptr @__cxa_begin_catch(ptr %3) #1 + tail call void @__cxa_end_catch() #1 + br label %try.cont + +try.cont: ; preds = %entry, %catch + ret void + +eh.resume: ; preds = %lpad + resume { ptr, i32 } %0 +} + +; CHECK-LABEL: call_try_catch +; CHECK: adrp x8, __imp_myFunc +; CHECK: ldr x8, [x8, :lo12:__imp_myFunc] +; CHECK: blr x8 + +declare dllimport void @myFunc() + +@_ZTIi = external constant ptr +declare dso_local i32 @__gxx_personality_seh0(...) +declare i32 @llvm.eh.typeid.for(ptr) #0 +declare dso_local ptr @__cxa_begin_catch(ptr) +declare dso_local void @__cxa_end_catch() + +attributes #0 = { nounwind memory(none) } +attributes #1 = { nounwind }