From 38bff3ec609e996c217e7852a48b6c6f471ef600 Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Mon, 11 Mar 2019 14:36:56 +0100
Subject: [PATCH] [parser] accept adjacent string literal tokens in extended
 GNU asm clauses

Apparently things like that exist in untamed code bases. Fixes #615
---
 src/kernel_internals/parsing/cparser.mly      | 13 +++++--------
 tests/syntax/assembly_gmp.c                   |  3 +++
 tests/syntax/oracle/assembly_gmp.0.res.oracle |  5 +++++
 tests/syntax/oracle/assembly_gmp.1.res.oracle |  5 +++++
 tests/syntax/oracle/assembly_gmp.2.res.oracle |  5 +++++
 5 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/kernel_internals/parsing/cparser.mly b/src/kernel_internals/parsing/cparser.mly
index 965974d98d9..7da75c2c4a1 100644
--- a/src/kernel_internals/parsing/cparser.mly
+++ b/src/kernel_internals/parsing/cparser.mly
@@ -736,10 +736,7 @@ string_constant:
    back to a string for easy viewing. */
     string_list                         { intlist_to_string (fst $1), snd $1 }
 ;
-one_string_constant:
-/* Don't concat multiple strings.  For asm templates. */
-    CST_STRING                          { intlist_to_string (fst $1) }
-;
+
 string_list:
     one_string                          { fst $1, snd $1 }
 |   string_list one_string              { merge_string $1 $2 }
@@ -1674,8 +1671,8 @@ asmattr:
 |    CONST asmattr                      { ("const", []) :: $2 }
 ;
 asmtemplate:
-    one_string_constant                          { [$1] }
-|   one_string_constant asmtemplate              { $1 :: $2 }
+    one_string                         { [intlist_to_string (fst $1)] }
+|   one_string asmtemplate             { intlist_to_string (fst $1) :: $2 }
 ;
 asmoutputs:
   /* empty */           { None }
@@ -1711,8 +1708,8 @@ asmclobber:
 | COLON asmcloberlst_ne asmlabels       { $2,$3 }
 ;
 asmcloberlst_ne:
-   one_string_constant                  { [$1] }
-|  one_string_constant COMMA asmcloberlst_ne     { $1 :: $3 }
+   string_constant                  { [fst $1] }
+|  string_constant COMMA asmcloberlst_ne     { fst $1 :: $3 }
 ;
 asmlabels:
 | /* empty */                          { [] }
diff --git a/tests/syntax/assembly_gmp.c b/tests/syntax/assembly_gmp.c
index 91147a15876..0d39854c42e 100644
--- a/tests/syntax/assembly_gmp.c
+++ b/tests/syntax/assembly_gmp.c
@@ -191,4 +191,7 @@ asm("sidt %0\n" : :"m"(loc));
 
 asm ("movq $36, (%0)": : "r"(pulValue));
 
+int a = 2, b = 3;
+  __asm__("mov %1, %0" : "=r"(a) :"r"(b): "%""eax");
+
 }
diff --git a/tests/syntax/oracle/assembly_gmp.0.res.oracle b/tests/syntax/oracle/assembly_gmp.0.res.oracle
index 64d451b45f1..eb6853729c5 100644
--- a/tests/syntax/oracle/assembly_gmp.0.res.oracle
+++ b/tests/syntax/oracle/assembly_gmp.0.res.oracle
@@ -140,6 +140,11 @@ void f(void)
         \from (indirect: pulValue), *(pulValue + (..));
   */
   __asm__ ("movq $36, (%0)" :  : "r" (pulValue));
+  int a = 2;
+  int b = 3;
+  /*@ assigns a;
+      assigns a \from b; */
+  __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax");
   return;
 }
 
diff --git a/tests/syntax/oracle/assembly_gmp.1.res.oracle b/tests/syntax/oracle/assembly_gmp.1.res.oracle
index 34e7312b07b..63a12b1b07b 100644
--- a/tests/syntax/oracle/assembly_gmp.1.res.oracle
+++ b/tests/syntax/oracle/assembly_gmp.1.res.oracle
@@ -123,6 +123,11 @@ void f(void)
         \from (indirect: pulValue), *(pulValue + (..));
   */
   __asm__ ("movq $36, (%0)" :  : "r" (pulValue));
+  int a = 2;
+  int b = 3;
+  /*@ assigns a;
+      assigns a \from b; */
+  __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax");
   return;
 }
 
diff --git a/tests/syntax/oracle/assembly_gmp.2.res.oracle b/tests/syntax/oracle/assembly_gmp.2.res.oracle
index 914bb19ed14..2684a9a6655 100644
--- a/tests/syntax/oracle/assembly_gmp.2.res.oracle
+++ b/tests/syntax/oracle/assembly_gmp.2.res.oracle
@@ -122,6 +122,11 @@ void f(void)
         \from (indirect: pulValue), *(pulValue + (..));
   */
   __asm__ ("movq $36, (%0)" :  : "r" (pulValue));
+  int a = 2;
+  int b = 3;
+  /*@ assigns a;
+      assigns a \from b; */
+  __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax");
   return;
 }
 
-- 
GitLab