util/sconfig: Re-factor emitting of headers to static.c

This change removes call to add_header from parsing functions and
moves it to a local function within main.c. It also adds a new
function emit_headers that is responsible for creating the linked list
for chip headers and emitting those to static.c

BUG=b:80081934
TEST=Verified that static.c for all files compiled using abuild is the
same with and without this change.

Change-Id: I24d526e81323115d3cc927242a4b9e49414afbe0
Signed-off-by: Furquan Shaikh <furquan@google.com>
Reviewed-on: https://review.coreboot.org/26726
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
diff --git a/util/sconfig/main.c b/util/sconfig/main.c
index 382d5e5..7cdde1c 100644
--- a/util/sconfig/main.c
+++ b/util/sconfig/main.c
@@ -22,8 +22,6 @@
 
 struct device *head, *lastdev;
 
-struct header headers;
-
 static struct chip *chip_head;
 
 /*
@@ -244,30 +242,6 @@
 	return new_chip;
 }
 
-void add_header(struct chip *chip)
-{
-	int include_exists = 0;
-	struct header *h = &headers;
-	while (h->next) {
-		int result = strcmp(chip->name, h->next->name);
-		if (result == 0) {
-			include_exists = 1;
-			break;
-		}
-		if (result < 0)
-			break;
-		h = h->next;
-	}
-	if (!include_exists) {
-		struct header *tmp = h->next;
-		h->next = malloc(sizeof(struct header));
-		memset(h->next, 0, sizeof(struct header));
-		h->next->chiph_exists = chip->chiph_exists;
-		h->next->name = chip->name;
-		h->next->next = tmp;
-	}
-}
-
 struct device *new_device(struct device *parent, struct device *busdev,
 			  struct chip *chip, const int bus, const char *devnum,
 			  int enabled)
@@ -622,10 +596,69 @@
 	} while (ptr);
 }
 
+static void add_header(struct chip *chip, struct header *h)
+{
+	int include_exists = 0;
+
+	while (h->next) {
+		int result = strcmp(chip->name, h->next->name);
+		if (result == 0) {
+			include_exists = 1;
+			break;
+		}
+		if (result < 0)
+			break;
+		h = h->next;
+	}
+
+	if (!include_exists) {
+		struct header *tmp = h->next;
+		h->next = malloc(sizeof(struct header));
+		memset(h->next, 0, sizeof(struct header));
+		h->next->chiph_exists = chip->chiph_exists;
+		h->next->name = chip->name;
+		h->next->next = tmp;
+	}
+}
+
+static void emit_headers(FILE *fil)
+{
+	struct header *h;
+	struct chip *chip;
+	struct header headers = {};
+
+	for (chip = chip_head; chip; chip = chip->next)
+		add_header(chip, &headers);
+
+	fprintf(fil, "#include <device/device.h>\n");
+	fprintf(fil, "#include <device/pci.h>\n");
+	h = &headers;
+	while (h->next) {
+		h = h->next;
+		if (h->chiph_exists)
+			fprintf(fil, "#include \"%s/chip.h\"\n", h->name);
+	}
+	fprintf(fil, "\n#if !DEVTREE_EARLY\n");
+	fprintf(fil,
+		"__attribute__((weak)) struct chip_operations mainboard_ops = {};\n");
+	h = &headers;
+	while (h->next) {
+		h = h->next;
+		char *name_underscore = translate_name(h->name, UNSLASH);
+		fprintf(fil,
+			"__attribute__((weak)) struct chip_operations %s_ops = {};\n",
+			name_underscore);
+		free(name_underscore);
+	}
+	fprintf(fil, "#endif\n");
+}
+
 static void emit_chips(FILE *fil)
 {
 	struct chip *chip;
 
+	emit_headers(fil);
+
 	for (chip = chip_head; chip; chip = chip->next) {
 		if (!chip->chiph_exists)
 			continue;
@@ -693,8 +726,6 @@
 	char *devtree = argv[DEVICEFILE_ARG];
 	char *outputc = argv[OUTPUTFILE_ARG];
 
-	headers.next = 0;
-
 	FILE *filec = fopen(devtree, "r");
 	if (!filec) {
 		perror(NULL);
@@ -717,29 +748,6 @@
 		exit(1);
 	}
 
-	struct header *h;
-	fprintf(autogen, "#include <device/device.h>\n");
-	fprintf(autogen, "#include <device/pci.h>\n");
-	h = &headers;
-	while (h->next) {
-		h = h->next;
-		if (h->chiph_exists)
-			fprintf(autogen, "#include \"%s/chip.h\"\n", h->name);
-	}
-	fprintf(autogen, "\n#if !DEVTREE_EARLY\n");
-	fprintf(autogen,
-		"__attribute__((weak)) struct chip_operations mainboard_ops = {};\n");
-	h = &headers;
-	while (h->next) {
-		h = h->next;
-		char *name_underscore = translate_name(h->name, UNSLASH);
-		fprintf(autogen,
-			"__attribute__((weak)) struct chip_operations %s_ops = {};\n",
-			name_underscore);
-		free(name_underscore);
-	}
-	fprintf(autogen, "#endif\n");
-
 	emit_chips(autogen);
 
 	walk_device_tree(autogen, &root, inherit_subsystem_ids, NULL);
diff --git a/util/sconfig/sconfig.h b/util/sconfig/sconfig.h
index 79d2da0..8e1d35c 100644
--- a/util/sconfig/sconfig.h
+++ b/util/sconfig/sconfig.h
@@ -110,7 +110,6 @@
 
 void postprocess_devtree(void);
 struct chip *new_chip(char *path);
-void add_header(struct chip *chip);
 struct device *new_device(struct device *parent, struct device *busdev,
 			  struct chip *chip, const int bus, const char *devnum,
 			  int enabled);
diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped
index 637927a..f8d1943 100644
--- a/util/sconfig/sconfig.tab.c_shipped
+++ b/util/sconfig/sconfig.tab.c_shipped
@@ -487,8 +487,8 @@
 static const yytype_uint8 yyrline[] =
 {
        0,    36,    36,    36,    38,    38,    38,    38,    40,    40,
-      40,    40,    40,    40,    42,    42,    52,    52,    64,    67,
-      70,    73,    76
+      40,    40,    40,    40,    42,    42,    51,    51,    63,    66,
+      69,    72,    75
 };
 #endif
 
@@ -1311,7 +1311,6 @@
 
     {
 	cur_chip = chip_dequeue_tail();
-	add_header((yyvsp[-2].chip));
 }
 
     break;
diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y
index 651aa87..671b435 100755
--- a/util/sconfig/sconfig.y
+++ b/util/sconfig/sconfig.y
@@ -46,7 +46,6 @@
 }
 	chipchildren END {
 	cur_chip = chip_dequeue_tail();
-	add_header($<chip>3);
 };
 
 device: DEVICE BUS NUMBER /* == devnum */ BOOL {