diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -524,7 +524,8 @@ // Get absolute path name. SourceManager &SM = CGM.getContext().getSourceManager(); - std::string MainFileName = CGM.getCodeGenOpts().MainFileName; + auto &CGO = CGM.getCodeGenOpts(); + std::string MainFileName = CGO.MainFileName; if (MainFileName.empty()) MainFileName = ""; @@ -560,11 +561,15 @@ if (LO.CPlusPlus) { if (LO.ObjC) LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; - else if (LO.CPlusPlus14 && (!CGM.getCodeGenOpts().DebugStrictDwarf || - CGM.getCodeGenOpts().DwarfVersion >= 5)) + else if (CGO.DebugStrictDwarf && CGO.DwarfVersion < 5) + LangTag = llvm::dwarf::DW_LANG_C_plus_plus; + else if (LO.CPlusPlus20) + LangTag = llvm::dwarf::DW_LANG_C_plus_plus_20; + else if (LO.CPlusPlus17) + LangTag = llvm::dwarf::DW_LANG_C_plus_plus_17; + else if (LO.CPlusPlus14) LangTag = llvm::dwarf::DW_LANG_C_plus_plus_14; - else if (LO.CPlusPlus11 && (!CGM.getCodeGenOpts().DebugStrictDwarf || - CGM.getCodeGenOpts().DwarfVersion >= 5)) + else if (LO.CPlusPlus11) LangTag = llvm::dwarf::DW_LANG_C_plus_plus_11; else LangTag = llvm::dwarf::DW_LANG_C_plus_plus; @@ -575,6 +580,10 @@ LangTag = llvm::dwarf::DW_LANG_OpenCL; } else if (LO.RenderScript) { LangTag = llvm::dwarf::DW_LANG_GOOGLE_RenderScript; + } else if (LO.C17) { + LangTag = llvm::dwarf::DW_LANG_C17; + } else if (LO.C11) { + LangTag = llvm::dwarf::DW_LANG_C11; } else if (LO.C99) { LangTag = llvm::dwarf::DW_LANG_C99; } else { diff --git a/clang/test/CodeGen/debug-info-programming-language.c b/clang/test/CodeGen/debug-info-programming-language.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/debug-info-programming-language.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -dwarf-version=3 -emit-llvm -triple %itanium_abi_triple %s -o - \ +// RUN: -x c -std=c11 -O0 -disable-llvm-passes -debug-info-kind=limited \ +// RUN: | FileCheck --check-prefix=CHECK-C11 %s +// RUN: %clang_cc1 -dwarf-version=3 -emit-llvm -triple %itanium_abi_triple %s -o - \ +// RUN: -x c -std=c17 -O0 -disable-llvm-passes -debug-info-kind=limited \ +// RUN: | FileCheck --check-prefix=CHECK-C17 %s + +// CHECK-C11: !DICompileUnit(language: DW_LANG_C11 +// CHECK-C17: !DICompileUnit(language: DW_LANG_C17 + +void f1(void) { } diff --git a/clang/test/CodeGenCXX/debug-info-programming-language.cpp b/clang/test/CodeGenCXX/debug-info-programming-language.cpp --- a/clang/test/CodeGenCXX/debug-info-programming-language.cpp +++ b/clang/test/CodeGenCXX/debug-info-programming-language.cpp @@ -4,6 +4,12 @@ // RUN: %clang_cc1 -dwarf-version=3 -emit-llvm -triple %itanium_abi_triple %s -o - \ // RUN: -x c++ -std=c++14 -O0 -disable-llvm-passes -debug-info-kind=limited \ // RUN: | FileCheck --check-prefix=CHECK-CPP14 %s +// RUN: %clang_cc1 -dwarf-version=3 -emit-llvm -triple %itanium_abi_triple %s -o - \ +// RUN: -x c++ -std=c++17 -O0 -disable-llvm-passes -debug-info-kind=limited \ +// RUN: | FileCheck --check-prefix=CHECK-CPP17 %s +// RUN: %clang_cc1 -dwarf-version=3 -emit-llvm -triple %itanium_abi_triple %s -o - \ +// RUN: -x c++ -std=c++20 -O0 -disable-llvm-passes -debug-info-kind=limited \ +// RUN: | FileCheck --check-prefix=CHECK-CPP20 %s // RUN: %clang_cc1 -dwarf-version=3 -gstrict-dwarf -emit-llvm -triple %itanium_abi_triple %s -o - \ // RUN: -x c++ -std=c++14 -O0 -disable-llvm-passes -debug-info-kind=limited | FileCheck %s // RUN: %clang_cc1 -dwarf-version=5 -gstrict-dwarf -emit-llvm -triple %itanium_abi_triple %s -o - \ @@ -15,4 +21,6 @@ } // CHECK-CPP14: distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, +// CHECK-CPP17: distinct !DICompileUnit(language: DW_LANG_C_plus_plus_17, +// CHECK-CPP20: distinct !DICompileUnit(language: DW_LANG_C_plus_plus_20, // CHECK: distinct !DICompileUnit(language: DW_LANG_C_plus_plus, diff --git a/llvm/include/llvm-c/DebugInfo.h b/llvm/include/llvm-c/DebugInfo.h --- a/llvm/include/llvm-c/DebugInfo.h +++ b/llvm/include/llvm-c/DebugInfo.h @@ -116,6 +116,15 @@ LLVMDWARFSourceLanguageFortran08, LLVMDWARFSourceLanguageRenderScript, LLVMDWARFSourceLanguageBLISS, + LLVMDWARFSourceLanguageKotlin, + LLVMDWARFSourceLanguageZig, + LLVMDWARFSourceLanguageCrystal, + LLVMDWARFSourceLanguageC_plus_plus_17, + LLVMDWARFSourceLanguageC_plus_plus_20, + LLVMDWARFSourceLanguageC17, + LLVMDWARFSourceLanguageFortran18, + LLVMDWARFSourceLanguageAda2005, + LLVMDWARFSourceLanguageAda2012, // Vendor extensions: LLVMDWARFSourceLanguageMips_Assembler, LLVMDWARFSourceLanguageGOOGLE_RenderScript, diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.h b/llvm/include/llvm/BinaryFormat/Dwarf.h --- a/llvm/include/llvm/BinaryFormat/Dwarf.h +++ b/llvm/include/llvm/BinaryFormat/Dwarf.h @@ -216,6 +216,8 @@ case DW_LANG_C_plus_plus_03: case DW_LANG_C_plus_plus_11: case DW_LANG_C_plus_plus_14: + case DW_LANG_C_plus_plus_17: + case DW_LANG_C_plus_plus_20: result = true; break; case DW_LANG_C89: @@ -256,6 +258,13 @@ case DW_LANG_BORLAND_Delphi: case DW_LANG_lo_user: case DW_LANG_hi_user: + case DW_LANG_Kotlin: + case DW_LANG_Zig: + case DW_LANG_Crystal: + case DW_LANG_C17: + case DW_LANG_Fortran18: + case DW_LANG_Ada2005: + case DW_LANG_Ada2012: result = false; break; } @@ -274,6 +283,7 @@ case DW_LANG_Fortran95: case DW_LANG_Fortran03: case DW_LANG_Fortran08: + case DW_LANG_Fortran18: result = true; break; case DW_LANG_C89: @@ -313,6 +323,14 @@ case DW_LANG_BORLAND_Delphi: case DW_LANG_lo_user: case DW_LANG_hi_user: + case DW_LANG_Kotlin: + case DW_LANG_Zig: + case DW_LANG_Crystal: + case DW_LANG_C_plus_plus_17: + case DW_LANG_C_plus_plus_20: + case DW_LANG_C17: + case DW_LANG_Ada2005: + case DW_LANG_Ada2012: result = false; break; } diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.def b/llvm/include/llvm/BinaryFormat/Dwarf.def --- a/llvm/include/llvm/BinaryFormat/Dwarf.def +++ b/llvm/include/llvm/BinaryFormat/Dwarf.def @@ -915,11 +915,22 @@ HANDLE_DW_LANG(0x0023, Fortran08, 1, 5, DWARF) HANDLE_DW_LANG(0x0024, RenderScript, 0, 5, DWARF) HANDLE_DW_LANG(0x0025, BLISS, 0, 5, DWARF) +// New since DWARF v5: +HANDLE_DW_LANG(0x0026, Kotlin, 0, 0, DWARF) +HANDLE_DW_LANG(0x0027, Zig, 0, 0, DWARF) +HANDLE_DW_LANG(0x0028, Crystal, 0, 0, DWARF) +HANDLE_DW_LANG(0x002a, C_plus_plus_17, 0, 0, DWARF) +HANDLE_DW_LANG(0x002b, C_plus_plus_20, 0, 0, DWARF) +HANDLE_DW_LANG(0x002c, C17, 0, 0, DWARF) +HANDLE_DW_LANG(0x002d, Fortran18, 0, 0, DWARF) +HANDLE_DW_LANG(0x002e, Ada2005, 0, 0, DWARF) +HANDLE_DW_LANG(0x002f, Ada2012, 0, 0, DWARF) // Vendor extensions: HANDLE_DW_LANG(0x8001, Mips_Assembler, None, 0, MIPS) HANDLE_DW_LANG(0x8e57, GOOGLE_RenderScript, 0, 0, GOOGLE) HANDLE_DW_LANG(0xb000, BORLAND_Delphi, 0, 0, BORLAND) + // DWARF attribute type encodings. HANDLE_DW_ATE(0x01, address, 2, DWARF) HANDLE_DW_ATE(0x02, boolean, 2, DWARF) diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -156,7 +156,7 @@ DICompileUnit::DebugNameTableKind NameTableKind, bool RangesBaseAddress, StringRef SysRoot, StringRef SDK) { - assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) || + assert(((Lang <= dwarf::DW_LANG_Ada2012 && Lang >= dwarf::DW_LANG_C89) || (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && "Invalid Language tag"); diff --git a/llvm/test/DebugInfo/X86/assumed_size_array.ll b/llvm/test/DebugInfo/X86/assumed_size_array.ll --- a/llvm/test/DebugInfo/X86/assumed_size_array.ll +++ b/llvm/test/DebugInfo/X86/assumed_size_array.ll @@ -3,6 +3,11 @@ ; RUN: llc -mtriple=x86_64-unknown-linux-gnu %s -filetype=obj -o %t.o ; RUN: llvm-dwarfdump %t.o | FileCheck %s +; RUN: rm -rf %t +; RUN: mkdir %t +; RUN: sed -e "s/Fortran90/Fortran18/" %s > %t/test.ll +; RUN: llc -mtriple=x86_64-unknown-linux-gnu %t/test.ll -filetype=obj -o %t/test.o +; RUN: llvm-dwarfdump %t/test.o | FileCheck %s ; CHECK-LABEL: DW_TAG_formal_parameter ; CHECK: DW_AT_name ("array1") diff --git a/llvm/test/DebugInfo/X86/dwarf-public-names.ll b/llvm/test/DebugInfo/X86/dwarf-public-names.ll --- a/llvm/test/DebugInfo/X86/dwarf-public-names.ll +++ b/llvm/test/DebugInfo/X86/dwarf-public-names.ll @@ -4,6 +4,24 @@ ; RUN: llvm-dwarfdump -debug-pubnames %t.o | FileCheck --check-prefix=NOPUB %s ; RUN: llc -mtriple=x86_64-scei-ps4 -filetype=obj -o %t.o < %s ; RUN: llvm-dwarfdump -debug-pubnames %t.o | FileCheck --check-prefix=NOPUB %s + +; RUN: rm -rf %t +; RUN: mkdir %t +; RUN: sed -e "s/C_plus_plus/C_plus_plus_03/" %s > %t/test.ll +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj -o %t/test.o < %t/test.ll +; RUN: llvm-dwarfdump -debug-pubnames %t/test.o | FileCheck --check-prefix=LINUX %s +; RUN: sed -e "s/C_plus_plus/C_plus_plus_11/" %s > %t/test.ll +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj -o %t/test.o < %t/test.ll +; RUN: llvm-dwarfdump -debug-pubnames %t/test.o | FileCheck --check-prefix=LINUX %s +; RUN: sed -e "s/C_plus_plus/C_plus_plus_14/" %s > %t/test.ll +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj -o %t/test.o < %t/test.ll +; RUN: llvm-dwarfdump -debug-pubnames %t/test.o | FileCheck --check-prefix=LINUX %s +; RUN: sed -e "s/C_plus_plus/C_plus_plus_17/" %s > %t/test.ll +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj -o %t/test.o < %t/test.ll +; RUN: llvm-dwarfdump -debug-pubnames %t/test.o | FileCheck --check-prefix=LINUX %s +; RUN: sed -e "s/C_plus_plus/C_plus_plus_20/" %s > %t/test.ll +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj -o %t/test.o < %t/test.ll +; RUN: llvm-dwarfdump -debug-pubnames %t/test.o | FileCheck --check-prefix=LINUX %s ; ModuleID = 'dwarf-public-names.cpp' ; ; Generated from: