diff options
| author | Arthur Eubanks <aeubanks@google.com> | 2021-09-23 13:54:24 -0700 |
|---|---|---|
| committer | Arthur Eubanks <aeubanks@google.com> | 2021-09-28 14:21:10 -0700 |
| commit | 2943071e2ee0c7f31f34062a44d12aeb0e3a66fd (patch) | |
| tree | cb2d13bc12775a1f42520c469a9c68d5abac4ae8 /clang/lib/CodeGen/CodeGenModule.cpp | |
| parent | 8379fc4a53cfd9e1a0280d60908ad4a171ad977d (diff) | |
[clang] Rework dontcall attributes
To avoid using the AST when emitting diagnostics, split the "dontcall"
attribute into "dontcall-warn" and "dontcall-error", and also add the
frontend attribute value as the LLVM attribute value. This gives us all
the information to report diagnostics we need from within the IR (aside
from access to the original source).
One downside is we directly use LLVM's demangler rather than using the
existing Clang diagnostic pretty printing of symbols.
Reviewed By: nickdesaulniers
Differential Revision: https://reviews.llvm.org/D110364
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 83418014f0b5..d26b1343247f 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2138,8 +2138,12 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F, else if (const auto *SA = FD->getAttr<SectionAttr>()) F->setSection(SA->getName()); - if (FD->hasAttr<ErrorAttr>()) - F->addFnAttr("dontcall"); + if (const auto *EA = FD->getAttr<ErrorAttr>()) { + if (EA->isError()) + F->addFnAttr("dontcall-error", EA->getUserDiagnostic()); + else if (EA->isWarning()) + F->addFnAttr("dontcall-warn", EA->getUserDiagnostic()); + } // If we plan on emitting this inline builtin, we can't treat it as a builtin. if (FD->isInlineBuiltinDeclaration()) { |
