diff mbox

[2/7,D] libiberty: Add support for demangling template constraints.

Message ID CABOHX+ebpyj=RsmAPSamBQ+0Q09DVLHP9bnGKTGxDqdw_pfx+g@mail.gmail.com
State New
Headers show

Commit Message

Iain Buclaw April 15, 2017, 3:20 p.m. UTC
This implements a previously an undocumented part of the D ABI spec,
where symbols instantiated inside a template constraint are given a
different prefix.  In practise however this should never be
encountered, as such instantiations are normally considered
speculative, and so never make it to object code.

---

Comments

Jeff Law April 24, 2017, 9:36 p.m. UTC | #1
On 04/15/2017 09:20 AM, Iain Buclaw wrote:
> This implements a previously an undocumented part of the D ABI spec,
> where symbols instantiated inside a template constraint are given a
> different prefix.  In practise however this should never be
> encountered, as such instantiations are normally considered
> speculative, and so never make it to object code.
> 
> ---
> 
> 
> 02-d-demangle-template-constraints.patch
> 
> 
> commit 9f3fa1f5842dc317b0aaf2f9aa159548c9b7a7f7
> Author: Iain Buclaw<ibuclaw@gdcproject.org>
> Date:   Sat Apr 15 11:29:35 2017 +0200
> 
>      libiberty/ChangeLog:
>      
>      2017-04-15  Iain Buclaw<ibuclaw@gdcproject.org>
>      
>      	* d-demangle.c (dlang_identifier): Handle template constraint symbols.
>      	(dlang_parse_template): Only advance if template symbol prefix is
>      	followed by a digit.
>      	* testsuite/d-demangle-expected: Add tests.
OK for the trunk.

jeff
diff mbox

Patch

commit 9f3fa1f5842dc317b0aaf2f9aa159548c9b7a7f7
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sat Apr 15 11:29:35 2017 +0200

    libiberty/ChangeLog:
    
    2017-04-15  Iain Buclaw  <ibuclaw@gdcproject.org>
    
    	* d-demangle.c (dlang_identifier): Handle template constraint symbols.
    	(dlang_parse_template): Only advance if template symbol prefix is
    	followed by a digit.
    	* testsuite/d-demangle-expected: Add tests.

diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
index af7c63d..74dde9d 100644
--- a/libiberty/d-demangle.c
+++ b/libiberty/d-demangle.c
@@ -769,14 +769,9 @@  dlang_identifier (string *decl, const char *mangled,
       mangled = endptr;
 
       /* May be a template instance.  */
-      if (len >= 5 && strncmp (mangled, "__T", 3) == 0)
-	{
-	  /* Template symbol.  */
-	  if (ISDIGIT (mangled[3]) && mangled[3] != '0')
-	    return dlang_parse_template (decl, mangled, len);
-
-	  return NULL;
-	}
+      if (len >= 5 && mangled[0] == '_' && mangled[1] == '_'
+	  && (mangled[2] == 'T' || mangled[2] == 'U'))
+	return dlang_parse_template (decl, mangled, len);
 
       switch (len)
 	{
@@ -1541,11 +1536,14 @@  dlang_parse_template (string *decl, const char *mangled, long len)
 
 	TemplateInstanceName:
 	    Number __T LName TemplateArgs Z
+	    Number __U LName TemplateArgs Z
 		   ^
      The start pointer should be at the above location, and LEN should be
      the value of the decoded number.
    */
-  if (strncmp (mangled, "__T", 3) != 0)
+
+  /* Template symbol.  */
+  if (!ISDIGIT (mangled[3]) || mangled[3] == '0')
     return NULL;
 
   mangled += 3;
diff --git a/libiberty/testsuite/d-demangle-expected b/libiberty/testsuite/d-demangle-expected
index 57f7c52..6725684 100644
--- a/libiberty/testsuite/d-demangle-expected
+++ b/libiberty/testsuite/d-demangle-expected
@@ -650,6 +650,10 @@  _D8demangle9__T4testZv
 demangle.test!()
 #
 --format=dlang
+_D8demangle9__U4testZv
+demangle.test!()
+#
+--format=dlang
 _D8demangle11__T4testTaZv
 demangle.test!(char)
 #