[llvm] Implement the DWARF 6 language and version attributes. (PR #89980)
Paul T Robinson via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 24 13:34:50 PDT 2024
================
@@ -209,6 +209,284 @@ enum SourceLanguage {
DW_LANG_hi_user = 0xffff
};
+enum SourceLanguageName : uint16_t {
+#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) DW_LNAME_##NAME = ID,
+#include "llvm/BinaryFormat/Dwarf.def"
+};
+
+/// Convert a DWARF 6 pair of language name and version to a DWARF 5 DW_LANG.
+inline std::optional<SourceLanguage> toDW_LANG(SourceLanguageName name,
+ uint32_t version) {
+ switch (name) {
+ case DW_LNAME_Ada: // YYYY
+ if (version <= 1983)
+ return DW_LANG_Ada83;
+ if (version <= 1995)
+ return DW_LANG_Ada95;
+ if (version <= 2005)
+ return DW_LANG_Ada2005;
+ if (version <= 2012)
+ return DW_LANG_Ada2012;
+ return {};
+ case DW_LNAME_BLISS:
+ return DW_LANG_BLISS;
+ case DW_LNAME_C: // YYYYMM, K&R 000000
+ if (version == 0)
+ return DW_LANG_C;
+ if (version <= 198912) // FIXME: Look up the correct months.
+ return DW_LANG_C89;
+ if (version <= 199912)
+ return DW_LANG_C99;
+ if (version <= 199912)
+ return DW_LANG_C99;
+ if (version <= 201112)
+ return DW_LANG_C11;
+ if (version <= 201712)
+ return DW_LANG_C17;
+ return {};
+ case DW_LNAME_C_plus_plus: // YYYYMM
+ if (version == 0)
+ return DW_LANG_C_plus_plus;
+ if (version <= 199711)
+ return DW_LANG_C_plus_plus;
+ if (version <= 200312) // FIXME: Look up the correct months.
+ return DW_LANG_C_plus_plus_03;
+ if (version <= 201103)
+ return DW_LANG_C_plus_plus_11;
+ if (version <= 201402)
+ return DW_LANG_C_plus_plus_14;
+ if (version <= 201703)
+ return DW_LANG_C_plus_plus_17;
+ if (version <= 202002)
+ return DW_LANG_C_plus_plus_20;
+ return {};
+ case DW_LNAME_Cobol: // YYYY
+ if (version <= 1974)
+ return DW_LANG_Cobol74;
+ if (version <= 1985)
+ return DW_LANG_Cobol85;
+ return {};
+ case DW_LNAME_Crystal:
+ return DW_LANG_Crystal;
+ case DW_LNAME_D:
+ return DW_LANG_D;
+ case DW_LNAME_Dylan:
+ return DW_LANG_Dylan;
+ case DW_LNAME_Fortran:
+ if (version <= 1977)
+ return DW_LANG_Fortran77;
+ if (version <= 1990)
+ return DW_LANG_Fortran90;
+ if (version <= 1995)
+ return DW_LANG_Fortran95;
+ if (version <= 2003)
+ return DW_LANG_Fortran03;
+ if (version <= 2008)
+ return DW_LANG_Fortran08;
+ if (version <= 2018)
+ return DW_LANG_Fortran18;
+ return {};
+ case DW_LNAME_Go:
+ return DW_LANG_Go;
+ case DW_LNAME_Haskell:
+ return DW_LANG_Haskell;
+ // case DW_LNAME_HIP:
+ // return DW_LANG_HIP;
+ case DW_LNAME_Java:
+ return DW_LANG_Java;
+ case DW_LNAME_Julia:
+ return DW_LANG_Julia;
+ case DW_LNAME_Kotlin:
+ return DW_LANG_Kotlin;
+ case DW_LNAME_Modula2:
+ return DW_LANG_Modula2;
+ case DW_LNAME_Modula3:
+ return DW_LANG_Modula3;
+ case DW_LNAME_ObjC:
+ return DW_LANG_ObjC;
+ case DW_LNAME_ObjC_plus_plus:
+ return DW_LANG_ObjC_plus_plus;
+ case DW_LNAME_OCaml:
+ return DW_LANG_OCaml;
+ case DW_LNAME_OpenCL_C:
+ return DW_LANG_OpenCL;
+ case DW_LNAME_Pascal:
+ return DW_LANG_Pascal83;
+ case DW_LNAME_PLI:
+ return DW_LANG_PLI;
+ case DW_LNAME_Python:
+ return DW_LANG_Python;
+ case DW_LNAME_RenderScript:
+ return DW_LANG_RenderScript;
+ case DW_LNAME_Rust:
+ return DW_LANG_Rust;
+ case DW_LNAME_Swift:
+ return DW_LANG_Swift;
+ case DW_LNAME_UPC:
+ return DW_LANG_UPC;
+ case DW_LNAME_Zig:
+ return DW_LANG_Zig;
+ case DW_LNAME_Assembly:
+ return DW_LANG_Assembly;
+ case DW_LNAME_C_sharp:
+ return DW_LANG_C_sharp;
+ case DW_LNAME_Mojo:
+ return DW_LANG_Mojo;
+ case DW_LNAME_GLSL:
+ return DW_LANG_GLSL;
+ case DW_LNAME_GLSL_ES:
+ return DW_LANG_GLSL_ES;
+ case DW_LNAME_HLSL:
+ return DW_LANG_HLSL;
+ case DW_LNAME_OpenCL_CPP:
+ return DW_LANG_OpenCL;
+ case DW_LNAME_CPP_for_OpenCL:
+ return {};
+ case DW_LNAME_SYCL:
+ return DW_LANG_SYCL;
+ case DW_LNAME_Ruby:
+ return DW_LANG_Ruby;
+ case DW_LNAME_Move:
+ return DW_LANG_Move;
+ case DW_LNAME_Hylo:
+ return DW_LANG_Hylo;
+ }
+ return {};
+}
+
+/// Convert a DWARF 6 pair of language name and version to a DWARF 5 DW_LANG.
----------------
pogo59 wrote:
This one converts the other way around.
https://github.com/llvm/llvm-project/pull/89980
More information about the llvm-commits
mailing list