diff mbox

[6/13] D: Add D language support to GCC proper.

Message ID CABOHX+eSRTZCaqRyOdevwhquvAMSPtdoVakU0uSn2u95fDXVrA@mail.gmail.com
State New
Headers show

Commit Message

Iain Buclaw May 28, 2017, 9:15 p.m. UTC
This patch adds D language support to GCC itself.

---

Comments

Jeff Law Sept. 11, 2017, 4:34 p.m. UTC | #1
On 05/28/2017 03:15 PM, Iain Buclaw wrote:
> This patch adds D language support to GCC itself.
> 
> ---
> 
> 
> 06-d-gcc-proper.patch
> 
> 
> gcc/ChangeLog
> 
> 	* config/rs6000/rs6000.c (rs6000_output_function_epilogue):
> 	Support GNU D by using 0 as the language type.
> 	* dwarf2out.c (is_dlang): New function.
> 	(gen_compile_unit_die): Use DW_LANG_D for D.
> 	(declare_in_namespace): Return module die for D, instead of adding
> 	extra declarations into the namespace.
> 	(gen_namespace_die): Generate DW_TAG_module for D.
> 	(gen_decl_die, dwarf2out_decl): Handle CONST_DECLSs for D.
> 	* gcc.c (default_compilers): Add entries for ".d", ".dd" and ".di".This is fine when prereqs are approved.

jeff
Mike Stump Sept. 11, 2017, 5:27 p.m. UTC | #2
On Sep 11, 2017, at 9:34 AM, Jeff Law <law@redhat.com> wrote:
> 
> On 05/28/2017 03:15 PM, Iain Buclaw wrote:
>> This patch adds D language support to GCC itself.
>> 
>> ---
>> 
>> 
>> 06-d-gcc-proper.patch
>> 
>> 
>> gcc/ChangeLog
>> 
>> 	* config/rs6000/rs6000.c (rs6000_output_function_epilogue):
>> 	Support GNU D by using 0 as the language type.
>> 	* dwarf2out.c (is_dlang): New function.
>> 	(gen_compile_unit_die): Use DW_LANG_D for D.
>> 	(declare_in_namespace): Return module die for D, instead of adding
>> 	extra declarations into the namespace.
>> 	(gen_namespace_die): Generate DW_TAG_module for D.
>> 	(gen_decl_die, dwarf2out_decl): Handle CONST_DECLSs for D.
>> 	* gcc.c (default_compilers): Add entries for ".d", ".dd" and ".di".This is fine when prereqs are approved.
> 
> jeff

ENOCOMMENT
Jeff Law Sept. 11, 2017, 5:30 p.m. UTC | #3
On 09/11/2017 11:27 AM, Mike Stump wrote:
> On Sep 11, 2017, at 9:34 AM, Jeff Law <law@redhat.com> wrote:
>>
>> On 05/28/2017 03:15 PM, Iain Buclaw wrote:
>>> This patch adds D language support to GCC itself.
>>>
>>> ---
>>>
>>>
>>> 06-d-gcc-proper.patch
>>>
>>>
>>> gcc/ChangeLog
>>>
>>> 	* config/rs6000/rs6000.c (rs6000_output_function_epilogue):
>>> 	Support GNU D by using 0 as the language type.
>>> 	* dwarf2out.c (is_dlang): New function.
>>> 	(gen_compile_unit_die): Use DW_LANG_D for D.
>>> 	(declare_in_namespace): Return module die for D, instead of adding
>>> 	extra declarations into the namespace.
>>> 	(gen_namespace_die): Generate DW_TAG_module for D.
>>> 	(gen_decl_die, dwarf2out_decl): Handle CONST_DECLSs for D.
>>> 	* gcc.c (default_compilers): Add entries for ".d", ".dd" and ".di".This is fine when prereqs are approved.
>>
>> jeff
> 
> ENOCOMMENT
Arggh.  It somehow got run onto the end of the ChangeLog.

"This is fine when the prereqs are approved." :-)

jeff
diff mbox

Patch

gcc/ChangeLog

	* config/rs6000/rs6000.c (rs6000_output_function_epilogue):
	Support GNU D by using 0 as the language type.
	* dwarf2out.c (is_dlang): New function.
	(gen_compile_unit_die): Use DW_LANG_D for D.
	(declare_in_namespace): Return module die for D, instead of adding
	extra declarations into the namespace.
	(gen_namespace_die): Generate DW_TAG_module for D.
	(gen_decl_die, dwarf2out_decl): Handle CONST_DECLSs for D.
	* gcc.c (default_compilers): Add entries for ".d", ".dd" and ".di".

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index b0d1dd95e5d..32f8527d940 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -31921,11 +31921,12 @@  rs6000_output_function_epilogue (FILE *file,
 	 use language_string.
 	 C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
 	 Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
-	 a number, so for now use 9.  LTO, Go and JIT aren't assigned numbers
-	 either, so for now use 0.  */
+	 a number, so for now use 9.  LTO, Go, D, and JIT aren't assigned
+	 numbers either, so for now use 0.  */
       if (lang_GNU_C ()
 	  || ! strcmp (language_string, "GNU GIMPLE")
 	  || ! strcmp (language_string, "GNU Go")
+	  || ! strcmp (language_string, "GNU D")
 	  || ! strcmp (language_string, "libgccjit"))
 	i = 0;
       else if (! strcmp (language_string, "GNU F77")
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 5ff45eb4efd..f4f32440695 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -5079,6 +5079,16 @@  is_ada (void)
   return lang == DW_LANG_Ada95 || lang == DW_LANG_Ada83;
 }
 
+/* Return TRUE if the language is D.  */
+
+static inline bool
+is_dlang (void)
+{
+  unsigned int lang = get_AT_unsigned (comp_unit_die (), DW_AT_language);
+
+  return lang == DW_LANG_D;
+}
+
 /* Remove the specified attribute if present.  Return TRUE if removal
    was successful.  */
 
@@ -23595,6 +23605,8 @@  gen_compile_unit_die (const char *filename)
 	language = DW_LANG_ObjC;
       else if (strcmp (language_string, "GNU Objective-C++") == 0)
 	language = DW_LANG_ObjC_plus_plus;
+      else if (strcmp (language_string, "GNU D") == 0)
+	language = DW_LANG_D;
       else if (dwarf_version >= 5 || !dwarf_strict)
 	{
 	  if (strcmp (language_string, "GNU Go") == 0)
@@ -25159,7 +25171,7 @@  declare_in_namespace (tree thing, dw_die_ref context_die)
 
   if (ns_context != context_die)
     {
-      if (is_fortran ())
+      if (is_fortran () || is_dlang ())
 	return ns_context;
       if (DECL_P (thing))
 	gen_decl_die (thing, NULL, NULL, ns_context);
@@ -25182,7 +25194,7 @@  gen_namespace_die (tree decl, dw_die_ref context_die)
     {
       /* Output a real namespace or module.  */
       context_die = setup_namespace_context (decl, comp_unit_die ());
-      namespace_die = new_die (is_fortran ()
+      namespace_die = new_die (is_fortran () || is_dlang ()
 			       ? DW_TAG_module : DW_TAG_namespace,
 			       context_die, decl);
       /* For Fortran modules defined in different CU don't add src coords.  */
@@ -25249,7 +25261,7 @@  gen_decl_die (tree decl, tree origin, struct vlr_context *ctx,
       break;
 
     case CONST_DECL:
-      if (!is_fortran () && !is_ada ())
+      if (!is_fortran () && !is_ada () && !is_dlang ())
 	{
 	  /* The individual enumerators of an enum type get output when we output
 	     the Dwarf representation of the relevant enum type itself.  */
@@ -25796,7 +25808,7 @@  dwarf2out_decl (tree decl)
     case CONST_DECL:
       if (debug_info_level <= DINFO_LEVEL_TERSE)
 	return;
-      if (!is_fortran () && !is_ada ())
+      if (!is_fortran () && !is_ada () && !is_dlang ())
 	return;
       if (TREE_STATIC (decl) && decl_function_context (decl))
 	context_die = lookup_decl_die (DECL_CONTEXT (decl));
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 4724276a318..6c3dd23a840 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -1309,6 +1309,7 @@  static const struct compiler default_compilers[] =
   {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
   {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
   {".go", "#Go", 0, 1, 0},
+  {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
   /* Next come the entries for C.  */
   {".c", "@c", 0, 0, 1},
   {"@c",