diff mbox series

[committed] d: Merge upstream dmd 740f3d1ea.

Message ID 20200605214920.2707-1-ibuclaw@gdcproject.org
State New
Headers show
Series [committed] d: Merge upstream dmd 740f3d1ea. | expand

Commit Message

Iain Buclaw June 5, 2020, 9:49 p.m. UTC
Hi,

This patch merges the D front-end implementation with upstream dmd
740f3d1ea.  Backports the conversion of the parameter fields debugids
and versionids to Identifiers.  The idea is that Identifiers should be
used instead of C strings where ever possible.

Bootstrapped and regression tested on x86_64-linux-gnu, and committed to
mainline.

Regards
Iain.


gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd 740f3d1ea.
	* d-lang.cc (d_handle_option): Use new fields to save debug and
	version levels passed over command-line.
	(d_post_options): Add them to front-end here.
---
 gcc/d/d-lang.cc      | 31 +++++++++++++++++++++++++++----
 gcc/d/dmd/MERGE      |  2 +-
 gcc/d/dmd/cond.c     | 40 +++++++++++++++-------------------------
 gcc/d/dmd/cond.h     |  4 +---
 gcc/d/dmd/dversion.c |  8 ++++----
 gcc/d/dmd/globals.h  |  3 +++
 gcc/d/dmd/module.h   |  8 ++++----
 7 files changed, 55 insertions(+), 41 deletions(-)
diff mbox series

Patch

diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc
index 203039e9ecf..54d5799e59c 100644
--- a/gcc/d/d-lang.cc
+++ b/gcc/d/d-lang.cc
@@ -443,14 +443,16 @@  d_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
 	  int level = integral_argument (arg);
 	  if (level != -1)
 	    {
-	      DebugCondition::setGlobalLevel (level);
+	      global.params.debuglevel = level;
 	      break;
 	    }
 	}
 
       if (Identifier::isValidIdentifier (CONST_CAST (char *, arg)))
 	{
-	  DebugCondition::addGlobalIdent (arg);
+	  if (!global.params.debugids)
+	    global.params.debugids = new Strings ();
+	  global.params.debugids->push (arg);
 	  break;
 	}
 
@@ -582,14 +584,16 @@  d_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
 	  int level = integral_argument (arg);
 	  if (level != -1)
 	    {
-	      VersionCondition::setGlobalLevel (level);
+	      global.params.versionlevel = level;
 	      break;
 	    }
 	}
 
       if (Identifier::isValidIdentifier (CONST_CAST (char *, arg)))
 	{
-	  VersionCondition::addGlobalIdent (arg);
+	  if (!global.params.versionids)
+	    global.params.versionids = new Strings ();
+	  global.params.versionids->push (arg);
 	  break;
 	}
 
@@ -812,6 +816,25 @@  d_post_options (const char ** fn)
   /* Has no effect yet.  */
   global.params.pic = flag_pic != 0;
 
+  /* Add in versions given on the command line.  */
+  if (global.params.versionids)
+    {
+      for (size_t i = 0; i < global.params.versionids->length; i++)
+	{
+	  const char *s = (*global.params.versionids)[i];
+	  VersionCondition::addGlobalIdent (s);
+	}
+    }
+
+  if (global.params.debugids)
+    {
+      for (size_t i = 0; i < global.params.debugids->length; i++)
+	{
+	  const char *s = (*global.params.debugids)[i];
+	  DebugCondition::addGlobalIdent (s);
+	}
+    }
+
   if (warn_return_type == -1)
     warn_return_type = 0;
 
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 3248bf7c982..540801d1d44 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@ 
-f5638c7b8a6912858a9b51987df6a725e6796dc9
+740f3d1eab81d88d11451083d955d5075f60d4e0
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
diff --git a/gcc/d/dmd/cond.c b/gcc/d/dmd/cond.c
index 88febdf5e1e..53c5499f158 100644
--- a/gcc/d/dmd/cond.c
+++ b/gcc/d/dmd/cond.c
@@ -29,15 +29,15 @@ 
 Expression *semantic(Expression *e, Scope *sc);
 bool evalStaticCondition(Scope *sc, Expression *exp, Expression *e, bool &errors);
 
-int findCondition(Strings *ids, Identifier *ident)
+int findCondition(Identifiers *ids, Identifier *ident)
 {
     if (ids)
     {
         for (size_t i = 0; i < ids->length; i++)
         {
-            const char *id = (*ids)[i];
+            Identifier *id = (*ids)[i];
 
-            if (strcmp(id, ident->toChars()) == 0)
+            if (id == ident)
                 return true;
         }
     }
@@ -391,16 +391,11 @@  Condition *DVCondition::syntaxCopy()
 
 /* ============================================================ */
 
-void DebugCondition::setGlobalLevel(unsigned level)
-{
-    global.params.debuglevel = level;
-}
-
 void DebugCondition::addGlobalIdent(const char *ident)
 {
-    if (!global.params.debugids)
-        global.params.debugids = new Strings();
-    global.params.debugids->push(ident);
+    if (!global.debugids)
+        global.debugids = new Identifiers();
+    global.debugids->push(Identifier::idPool(ident));
 }
 
 
@@ -444,12 +439,12 @@  int DebugCondition::include(Scope *sc)
                 inc = 1;
                 definedInModule = true;
             }
-            else if (findCondition(global.params.debugids, ident))
+            else if (findCondition(global.debugids, ident))
                 inc = 1;
             else
             {   if (!mod->debugidsNot)
-                    mod->debugidsNot = new Strings();
-                mod->debugidsNot->push(ident->toChars());
+                    mod->debugidsNot = new Identifiers();
+                mod->debugidsNot->push(ident);
             }
         }
         else if (level <= global.params.debuglevel || level <= mod->debuglevel)
@@ -462,11 +457,6 @@  int DebugCondition::include(Scope *sc)
 
 /* ============================================================ */
 
-void VersionCondition::setGlobalLevel(unsigned level)
-{
-    global.params.versionlevel = level;
-}
-
 static bool isReserved(const char *ident)
 {
     static const char* reserved[] =
@@ -598,9 +588,9 @@  void VersionCondition::addGlobalIdent(const char *ident)
 
 void VersionCondition::addPredefinedGlobalIdent(const char *ident)
 {
-    if (!global.params.versionids)
-        global.params.versionids = new Strings();
-    global.params.versionids->push(ident);
+    if (!global.versionids)
+        global.versionids = new Identifiers();
+    global.versionids->push(Identifier::idPool(ident));
 }
 
 
@@ -624,13 +614,13 @@  int VersionCondition::include(Scope *sc)
                 inc = 1;
                 definedInModule = true;
             }
-            else if (findCondition(global.params.versionids, ident))
+            else if (findCondition(global.versionids, ident))
                 inc = 1;
             else
             {
                 if (!mod->versionidsNot)
-                    mod->versionidsNot = new Strings();
-                mod->versionidsNot->push(ident->toChars());
+                    mod->versionidsNot = new Identifiers();
+                mod->versionidsNot->push(ident);
             }
         }
         else if (level <= global.params.versionlevel || level <= mod->versionlevel)
diff --git a/gcc/d/dmd/cond.h b/gcc/d/dmd/cond.h
index c32f7bba5e6..1963f0519a9 100644
--- a/gcc/d/dmd/cond.h
+++ b/gcc/d/dmd/cond.h
@@ -23,7 +23,7 @@  class DebugCondition;
 class ForeachStatement;
 class ForeachRangeStatement;
 
-int findCondition(Strings *ids, Identifier *ident);
+int findCondition(Identifiers *ids, Identifier *ident);
 
 class Condition
 {
@@ -76,7 +76,6 @@  public:
 class DebugCondition : public DVCondition
 {
 public:
-    static void setGlobalLevel(unsigned level);
     static void addGlobalIdent(const char *ident);
 
     DebugCondition(Module *mod, unsigned level, Identifier *ident);
@@ -89,7 +88,6 @@  public:
 class VersionCondition : public DVCondition
 {
 public:
-    static void setGlobalLevel(unsigned level);
     static void addGlobalIdent(const char *ident);
     static void addPredefinedGlobalIdent(const char *ident);
 
diff --git a/gcc/d/dmd/dversion.c b/gcc/d/dmd/dversion.c
index f9f4b75a6f2..3c539a7ff83 100644
--- a/gcc/d/dmd/dversion.c
+++ b/gcc/d/dmd/dversion.c
@@ -81,8 +81,8 @@  void DebugSymbol::addMember(Scope *, ScopeDsymbol *sds)
                 errors = true;
             }
             if (!m->debugids)
-                m->debugids = new Strings();
-            m->debugids->push(ident->toChars());
+                m->debugids = new Identifiers();
+            m->debugids->push(ident);
         }
     }
     else
@@ -172,8 +172,8 @@  void VersionSymbol::addMember(Scope *, ScopeDsymbol *sds)
                 errors = true;
             }
             if (!m->versionids)
-                m->versionids = new Strings();
-            m->versionids->push(ident->toChars());
+                m->versionids = new Identifiers();
+            m->versionids->push(ident);
         }
     }
     else
diff --git a/gcc/d/dmd/globals.h b/gcc/d/dmd/globals.h
index be75fc09d2e..a6449b93ab8 100644
--- a/gcc/d/dmd/globals.h
+++ b/gcc/d/dmd/globals.h
@@ -239,6 +239,9 @@  struct Global
 
     void* console;         // opaque pointer to console for controlling text attributes
 
+    Array<class Identifier*>* versionids; // command line versions and predefined versions
+    Array<class Identifier*>* debugids;   // command line debug versions and predefined versions
+
     /* Start gagging. Return the current number of gagged errors
      */
     unsigned startGagging();
diff --git a/gcc/d/dmd/module.h b/gcc/d/dmd/module.h
index 5c799bb7e82..17ad5904523 100644
--- a/gcc/d/dmd/module.h
+++ b/gcc/d/dmd/module.h
@@ -100,12 +100,12 @@  public:
     Modules aimports;             // all imported modules
 
     unsigned debuglevel;        // debug level
-    Strings *debugids;      // debug identifiers
-    Strings *debugidsNot;       // forward referenced debug identifiers
+    Identifiers *debugids;      // debug identifiers
+    Identifiers *debugidsNot;       // forward referenced debug identifiers
 
     unsigned versionlevel;      // version level
-    Strings *versionids;    // version identifiers
-    Strings *versionidsNot;     // forward referenced version identifiers
+    Identifiers *versionids;    // version identifiers
+    Identifiers *versionidsNot;     // forward referenced version identifiers
 
     Macro *macrotable;          // document comment macros
     Escape *escapetable;        // document comment escapes