diff mbox

nios2 builds still broken due to streamer changes

Message ID 54AFA06D.7020503@suse.cz
State New
Headers show

Commit Message

Martin Liška Jan. 9, 2015, 9:33 a.m. UTC
On 12/19/2014 05:10 AM, Sandra Loosemore wrote:
> On 11/19/2014 09:34 PM, Jan Hubicka wrote:
>> [snip]
>>
>> As for timeline, I have a workshop next week and need to prepare draft for it.
>> So ideally I would like to work on this only after the workshop (ending
>> November 28). I would be also happy to help anyone interested to help (I am
>> just bit slow on portable AWK hacking).
>
> Has there been any progress on getting this fixed?  It's been over a month since this was reported and I see nios2-elf builds are still broken.  It's blocking me testing a fix for PR59710, among other things.
>
> -Sandra
>

Hello Sandra.

After talking to Honza, I decided to implement array support, marked as 1) from Honza's.
I don't have any nios2 target I can bootstrap, so the following patch has been just
tested for stage1 compiler.

Does it solve your bootstrap problems?

Thanks,
Martin
diff mbox

Patch

From f0249323295d02373211a03f5465b8dc3f786bf0 Mon Sep 17 00:00:00 2001
From: mliska <mliska@suse.cz>
Date: Fri, 9 Jan 2015 10:31:00 +0100
Subject: [PATCH] Initial version.

---
 gcc/optc-save-gen.awk | 44 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk
index ebeb509..5578144 100644
--- a/gcc/optc-save-gen.awk
+++ b/gcc/optc-save-gen.awk
@@ -437,6 +437,7 @@  print "                     struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED
 print "{";
 n_target_val = 0;
 n_target_str = 0;
+n_target_array = 0;
 
 for (i = 0; i < n_target_save; i++) {
 	var = target_save_decl[i];
@@ -448,8 +449,20 @@  for (i = 0; i < n_target_save; i++) {
 	if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$")
 		var_target_str[n_target_str++] = name;
 	else {
-		var_target_val_type[n_target_val] = type;
-		var_target_val[n_target_val++] = name;
+		if (target_save_decl[i] ~ " .*\\[.+\\]+$") {
+			size = name;
+			sub("[^\\[]+\\[", "", size);
+			sub("\\]$", "", size);
+			sub("\\[.+", "", name)
+			sub(" [^ ]+$", "", type)
+			var_target_array[n_target_array] = name
+			var_target_array_type[n_target_array] = type
+			var_target_array_size[n_target_array++] = size
+		}
+		else {
+			var_target_val_type[n_target_val] = type;
+			var_target_val[n_target_val++] = name;
+		}
 	}
 }
 if (have_save) {
@@ -484,6 +497,14 @@  for (i = 0; i < n_target_str; i++) {
 	print "          || strcmp (ptr1->" name", ptr2->" name ")))";
 	print "    return false;";
 }
+for (i = 0; i < n_target_array; i++) {
+	name = var_target_array[i]
+	size = var_target_array_size[i]
+	type = var_target_array_type[i]
+	print "  if (ptr1->" name" != ptr2->" name "";
+	print "      || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))"
+	print "    return false;";
+}
 for (i = 0; i < n_target_val; i++) {
 	name = var_target_val[i]
 	print "  if (ptr1->" name" != ptr2->" name ")";
@@ -507,6 +528,13 @@  for (i = 0; i < n_target_str; i++) {
 	print "  else";
 	print "    hstate.add_int (0);";
 }
+for (i = 0; i < n_target_array; i++) {
+	name= var_target_array[i]
+	size = var_target_array_size[i]
+	type = var_target_array_type[i]
+	print "  hstate.add_int (" size ");";
+	print "  hstate.add (ptr->" name ", sizeof (" type ") * " size ");";
+}
 for (i = 0; i < n_target_val; i++) {
 	name = var_target_val[i]
 	print "  hstate.add_wide_int (ptr->" name");";
@@ -525,6 +553,12 @@  for (i = 0; i < n_target_str; i++) {
 	name = var_target_str[i]
 	print "  bp_pack_string (ob, bp, ptr->" name", true);";
 }
+for (i = 0; i < n_target_array; i++) {
+	name = var_target_array[i]
+	size = var_target_array_size[i]
+	print "  for (unsigned i = 0; i < " size "; i++)"
+	print "    bp_pack_value (bp, ptr->" name "[i], 64);";
+}
 for (i = 0; i < n_target_val; i++) {
 	name = var_target_val[i]
 	print "  bp_pack_value (bp, ptr->" name", 64);";
@@ -544,6 +578,12 @@  for (i = 0; i < n_target_str; i++) {
 	print "  if (ptr->" name")";
 	print "    ptr->" name" = xstrdup (ptr->" name");";
 }
+for (i = 0; i < n_target_array; i++) {
+	name = var_target_array[i]
+	size = var_target_array_size[i]
+	print "  for (int i = " size "; i >= 0; i--)"
+	print "    ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);";
+}
 for (i = 0; i < n_target_val; i++) {
 	name = var_target_val[i]
 	print "  ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);";
-- 
2.1.2