diff options
author | Chen Zheng <czhengsz@cn.ibm.com> | 2024-07-08 09:30:01 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-08 09:30:01 +0800 |
commit | afd0e6d06ba05cf3cd8b0bb91b6506242de78a4d (patch) | |
tree | 57a519d8b87a25239c3fa135fcdf0d7da2c823f4 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | cc5ba739f27ab2f28d4a0f2e295d1e426aa836a7 (diff) | |
download | llvm-afd0e6d06ba05cf3cd8b0bb91b6506242de78a4d.zip llvm-afd0e6d06ba05cf3cd8b0bb91b6506242de78a4d.tar.gz llvm-afd0e6d06ba05cf3cd8b0bb91b6506242de78a4d.tar.bz2 |
[PowerPC] Diagnose musttail instead of crash inside backend (#93267)
musttail is not often possible to be generated on PPC targets as when
calling to a function defined in another module, PPC needs to restore
the TOC pointer. To restore the TOC pointer, compiler needs to emit a
nop after the call to let linker generate codes to restore TOC pointer.
Tail call cannot generate expected call sequence for this case.
To avoid the crash inside the compiler backend, a diagnosis is added in
the frontend.
Fixes #63214
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index dc9dd03..44bc7fb 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1394,6 +1394,21 @@ void CodeGenModule::Release() { // that might affect the DLL storage class or the visibility, and // before anything that might act on these. setVisibilityFromDLLStorageClass(LangOpts, getModule()); + + // Check the tail call symbols are truly undefined. + if (getTriple().isPPC() && !MustTailCallUndefinedGlobals.empty()) { + for (auto &I : MustTailCallUndefinedGlobals) { + if (!I.first->isDefined()) + getDiags().Report(I.second, diag::err_ppc_impossible_musttail) << 2; + else { + StringRef MangledName = getMangledName(GlobalDecl(I.first)); + llvm::GlobalValue *Entry = GetGlobalValue(MangledName); + if (!Entry || Entry->isWeakForLinker() || + Entry->isDeclarationForLinker()) + getDiags().Report(I.second, diag::err_ppc_impossible_musttail) << 2; + } + } + } } void CodeGenModule::EmitOpenCLMetadata() { |