aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <Michael Meissner meissner@linux.ibm.com>2020-05-05 13:30:07 -0400
committerMichael Meissner <Michael Meissner meissner@linux.ibm.com>2020-05-05 13:30:07 -0400
commit9fc1dff1196d4b7784c64b21e7536112106b18da (patch)
treecef84f70655218458fbc4c6898eabe03729236c8
parentf1d82734ecfc3fc9913d598871192fd0f3fff536 (diff)
downloadgcc-9fc1dff1196d4b7784c64b21e7536112106b18da.zip
gcc-9fc1dff1196d4b7784c64b21e7536112106b18da.tar.gz
gcc-9fc1dff1196d4b7784c64b21e7536112106b18da.tar.bz2
Patch ieee128-lib-patch002b
-rw-r--r--gcc/ChangeLog.meissner8
-rw-r--r--gcc/config/rs6000/rs6000.c28
2 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog.meissner b/gcc/ChangeLog.meissner
index 332f5ea..ab1d5af 100644
--- a/gcc/ChangeLog.meissner
+++ b/gcc/ChangeLog.meissner
@@ -1,5 +1,13 @@
2020-05-05 Michael Meissner <meissner@linux.ibm.com>
+ (ieee128-lib-patch002b)
+ PR target/94630
+ * config/rs6000/rs6000.c (rs6000_mangle_decl_assembler_name): When
+ long double is IEEE 128-bit, map *printf and *scanf built-in
+ functions to the IEEE 128-bit name.
+
+2020-05-05 Michael Meissner <meissner@linux.ibm.com>
+
(ieee128-lib-patch001b)
PR target/94630
* config/rs6000/rs6000.c (rs6000_mangle_decl_assembler_name): Do
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index abc1b89..dc18441 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -26340,7 +26340,33 @@ rs6000_mangle_decl_assembler_name (tree decl, tree id)
size_t len = IDENTIFIER_LENGTH (id);
const char *name = IDENTIFIER_POINTER (id);
- if (name[len - 1] == 'l')
+ /* Update the __builtin_*printf && __builtin_*scanf functions. */
+ const size_t printf_len = sizeof ("printf") - 1;
+ const size_t scanf_len = sizeof ("scanf") - 1;
+ const size_t printf_extra = sizeof ("__") - 1 + sizeof ("ieee128") - 1;
+ const size_t scanf_extra = sizeof ("__isoc99_") - 1 + sizeof ("ieee128") - 1;
+
+ if (len >= printf_len
+ && strcmp (name + len - printf_len, "printf") == 0)
+ {
+ char *newname = (char *) alloca (len + 1 + printf_extra);
+ strcpy (newname, "__");
+ memcpy (newname + 2, name, len);
+ strcpy (newname + 2 + len, "ieee128");
+ id = get_identifier (newname);
+ }
+
+ else if (len >= scanf_len
+ && strcmp (name + len - scanf_len, "scanf") == 0)
+ {
+ char *newname = (char *) alloca (len + 1 + scanf_extra);
+ strcpy (newname, "__isoc99_");
+ memcpy (newname + sizeof ("__isoc99") - 1, name, len);
+ strcpy (newname + sizeof ("__isoc99") - 1 + len, "ieee128");
+ id = get_identifier (newname);
+ }
+
+ else if (name[len - 1] == 'l')
{
bool uses_ieee128_p = false;
tree type = TREE_TYPE (decl);