Skip to content

Commit

Permalink
clang: Allow backend unsupported warnings
Browse files Browse the repository at this point in the history
Currently this asserts on anything other than errors. In one
workaround scenario, AMDGPU emits DiagnosticInfoUnsupported as a
warning for functions that can't be correctly codegened, but should
never be executed.
  • Loading branch information
arsenm committed Apr 27, 2020
1 parent 8a4013e commit 5c03bee
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 3 deletions.
1 change: 1 addition & 0 deletions clang/include/clang/Basic/DiagnosticFrontendKinds.td
Expand Up @@ -61,6 +61,7 @@ def note_fe_backend_invalid_loc : Note<"could "
"not determine the original source location for %0:%1:%2">, BackendInfo;

def err_fe_backend_unsupported : Error<"%0">, BackendInfo;
def warn_fe_backend_unsupported : Warning<"%0">, BackendInfo;

def err_fe_invalid_code_complete_file : Error<
"cannot locate code-completion file %0">, DefaultFatal;
Expand Down
11 changes: 8 additions & 3 deletions clang/lib/CodeGen/CodeGenAction.cpp
Expand Up @@ -633,8 +633,9 @@ const FullSourceLoc BackendConsumer::getBestLocationFromDebugLoc(

void BackendConsumer::UnsupportedDiagHandler(
const llvm::DiagnosticInfoUnsupported &D) {
// We only support errors.
assert(D.getSeverity() == llvm::DS_Error);
// We only support warnings or errors.
assert(D.getSeverity() == llvm::DS_Error ||
D.getSeverity() == llvm::DS_Warning);

StringRef Filename;
unsigned Line, Column;
Expand All @@ -652,7 +653,11 @@ void BackendConsumer::UnsupportedDiagHandler(
DiagnosticPrinterRawOStream DP(MsgStream);
D.print(DP);
}
Diags.Report(Loc, diag::err_fe_backend_unsupported) << MsgStream.str();

auto DiagType = D.getSeverity() == llvm::DS_Error
? diag::err_fe_backend_unsupported
: diag::warn_fe_backend_unsupported;
Diags.Report(Loc, DiagType) << MsgStream.str();

if (BadDebugInfo)
// If we were not able to translate the file:line:col information
Expand Down
30 changes: 30 additions & 0 deletions clang/test/CodeGenOpenCL/backend-unsupported-warning.ll
@@ -0,0 +1,30 @@
; RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -S -o - %s 2>&1 | FileCheck %s

; Check that a DiagnosticUnsupported reported as a warning works
; correctly, and is not emitted as an error.

; CHECK: warning: test.c:2:20: in function use_lds_global_in_func i32 (): local memory global used by non-kernel function

target triple = "amdgcn-amd-amdhsa"

@lds = external addrspace(3) global i32, align 4

define i32 @use_lds_global_in_func() !dbg !5 {
%load = load i32, i32 addrspace(3)* @lds, !dbg !9
ret i32 %load, !dbg !10
}

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4}

!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.9.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
!1 = !DIFile(filename: "test.c", directory: "")
!2 = !{}
!3 = !{i32 2, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 2, type: !6, scopeLine: 2, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
!6 = !DISubroutineType(types: !7)
!7 = !{!8}
!8 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
!9 = !DILocation(line: 2, column: 20, scope: !5)
!10 = !DILocation(line: 2, column: 13, scope: !5)

0 comments on commit 5c03bee

Please sign in to comment.