import gdb-1999-08-16 snapshot
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.hp / gdb.base-hp / genso-thresh.c
1 /*
2 * Program to generate the so-thresh testcase,
3 * including associated linked-against shared libraries.
4 * Build as:
5 *
6 * cc -g -o genso-thresh genso-thresh.c
7 *
8 * Invoke as:
9 *
10 * genso-thresh
11 *
12 * It will put all the code in the current directory (".").
13 *
14 * A makefile can also be generated if the -makemake option is used.
15 * To use the makefile:
16 *
17 * make -f so-thresh.mk all
18 *
19 * The name of the application is
20 *
21 * so-thresh
22 *
23 * (Revised from a program by John Bishop. --rehrauer)
24 */
25
26 #include <stdio.h>
27 #include <sys/stat.h>
28 #include <sys/fcntl.h>
29
30 int main (argc, argv)
31 int argc;
32 char **argv;
33 {
34 #define NUMBER_OF_INT_VARS 1500
35 #define NUMBER_OF_LIBS 3
36 int lib_num = NUMBER_OF_LIBS;
37 int i;
38 int i2;
39 FILE *main_file;
40 FILE *lib_file;
41 FILE *make_file;
42 FILE *link_file;
43
44 char testcase_name [1000];
45 char linkfile_name [1000];
46 char makefile_name [1000];
47 char mainfile_name [1000];
48
49 char file_name[100];
50 /*
51 * 0123456789 <-- length of field
52 * "./fil0000000002.c"; <-- typical filename
53 * 12345678901234567890 <-- length of string
54 * 10 20
55 * ^where null goes
56 */
57 char file_name_core[100];
58
59 /* Verify input.
60 */
61 if ((argc < 1) || (argc > 2) || (argv == NULL) ||
62 ((argc == 2) && (strcmp (argv[1], "-makemake") != 0)))
63 {
64 printf ("** Syntax: %s [-makemake]\n", argv[0]);
65 return;
66 }
67
68 if (strncmp (argv[0], "gen", 3) != 0)
69 {
70 printf ("** This tool expected to be named \"gen<something>\"\n");
71 return;
72 }
73 strcpy (testcase_name, argv[0]+3);
74
75 strcpy (linkfile_name, testcase_name);
76 strcat (linkfile_name, ".lopt");
77 link_file = fopen (linkfile_name, "w");
78 fprintf (link_file, "# Linker options for %s test\n", testcase_name);
79
80 /* Generate the makefile, if requested.
81 */
82 if (argc == 2)
83 {
84 strcpy (makefile_name, testcase_name);
85 strcat (makefile_name, ".mk.new");
86 make_file = fopen (makefile_name, "w");
87 printf (" Note: New makefile (%s) generated.\n", makefile_name);
88 printf (" May want to update existing makefile, if any.\n");
89 fprintf (make_file, "# Generated automatically by %s\n", argv[0]);
90 fprintf (make_file, "# Make file for %s test\n", testcase_name);
91 fprintf (make_file, "\n");
92 fprintf (make_file, "CFLAGS = +DA1.1 -g\n");
93 fprintf (make_file, "\n");
94 fprintf (make_file, "# This is how to build this generator.\n");
95 fprintf (make_file, "%s.o: %s.c\n", argv[0], argv[0]);
96 fprintf (make_file, "\t$(CC) $(CFLAGS) -o %s.o -c %s.c\n", argv[0], argv[0]);
97 fprintf (make_file, "%s: %s.o\n", argv[0], argv[0]);
98 fprintf (make_file, "\t$(CC) $(CFLAGS) -o %s %s.o\n", argv[0], argv[0]);
99 fprintf (make_file, "\n");
100 fprintf (make_file, "# This is how to run this generator.\n");
101 fprintf (make_file, "# This target should be made before the 'all' target,\n");
102 fprintf (make_file, "# to ensure that the shlib sources are all available.\n");
103 fprintf (make_file, "require_shlibs: %s\n", argv[0]);
104 for (i=0; i < lib_num; i++)
105 {
106 fprintf (make_file, "\tif ! [ -a lib%2.2d_%s.c ] ; then \\\n", i, testcase_name);
107 fprintf (make_file, "\t %s ; \\\n", argv[0]);
108 fprintf (make_file, "\tfi\n");
109 }
110 fprintf (make_file, "\n");
111 fprintf (make_file, "# This is how to build all the shlibs.\n");
112 fprintf (make_file, "# Be sure to first make the require_shlibs target!\n");
113 for (i=0; i < lib_num; i++)
114 {
115 fprintf (make_file, "lib%2.2d_%s.o: lib%2.2d_%s.c\n", i, testcase_name, i, testcase_name);
116 fprintf (make_file, "\t$(CC) $(CFLAGS) +Z -o lib%2.2d_%s.o -c lib%2.2d_%s.c\n", i, testcase_name, i, testcase_name);
117 fprintf (make_file, "lib%2.2d-%s.sl: lib%2.2d-%s.o\n", i, testcase_name, i, testcase_name);
118 fprintf (make_file, "\t$(LD) $(LDFLAGS) -b -o lib%2.2d-%s.sl lib%2.2d-%s.o\n", i, testcase_name, i, testcase_name);
119 }
120 fprintf (make_file, "\n");
121 fprintf (make_file, "# For convenience, here's names for all pieces of all shlibs.\n");
122 fprintf (make_file, "SHLIB_SOURCES = \\\n");
123 for (i=0; i < lib_num-1; i++)
124 fprintf (make_file, "\tlib%2.2d-%s.c \\\n", i, testcase_name);
125 fprintf (make_file, "\tlib%2.2d-%s.c\n", lib_num-1, testcase_name);
126 fprintf (make_file, "SHLIB_OBJECTS = $(SHLIB_SOURCES:.c=.o)\n");
127 fprintf (make_file, "SHLIBS = $(SHLIB_SOURCES:.c=.sl)\n");
128 fprintf (make_file, "SHLIB_NAMES = $(SHLIB_SOURCES:.c=)\n");
129 fprintf (make_file, "EXECUTABLES = $(SHLIBS) %s %s\n", argv[0], testcase_name);
130 fprintf (make_file, "OBJECT_FILES = $(SHLIB_OBJECTS) %s.o %s.o\n", argv[0], testcase_name);
131 fprintf (make_file, "\n");
132 fprintf (make_file, "shlib_objects: $(SHLIB_OBJECTS)\n");
133 fprintf (make_file, "shlibs: $(SHLIBS)\n");
134 fprintf (make_file, "\n");
135 fprintf (make_file, "# This is how to build the debuggable testcase that uses the shlibs.\n");
136 fprintf (make_file, "%s.o: %s.c\n", testcase_name, testcase_name);
137 fprintf (make_file, "\t$(CC) $(CFLAGS) -o %s.o -c %s.c\n", testcase_name, testcase_name);
138 fprintf (make_file, "%s: shlibs %s.o\n", testcase_name, testcase_name);
139 fprintf (make_file, "\t$(LD) $(LDFLAGS) -o %s -lc -L. ", testcase_name);
140 fprintf (make_file, "-c %s /opt/langtools/lib/end.o /lib/crt0.o %s.o\n", linkfile_name, testcase_name);
141 fprintf (make_file, "\n");
142 fprintf (make_file, "# Yeah, but you should first make the require_shlibs target!\n");
143 fprintf (make_file, "all: %s %s\n", testcase_name, argv[0]);
144 fprintf (make_file, "\n");
145 fprintf (make_file, "# To remove everything built via this makefile...\n");
146 fprintf (make_file, "clean:\n");
147 /* Do this carefully, to avoid hitting silly HP-UX ARG_MAX limits... */
148 fprintf (make_file, "\trm -f lib0*-%s.*\n", testcase_name);
149 fprintf (make_file, "\trm -f lib1*-%s.*\n", testcase_name);
150 fprintf (make_file, "\trm -f lib2*-%s.*\n", testcase_name);
151 fprintf (make_file, "\trm -f lib3*-%s.*\n", testcase_name);
152 fprintf (make_file, "\trm -f lib4*-%s.*\n", testcase_name);
153 fprintf (make_file, "\trm -f lib5*-%s.*\n", testcase_name);
154 fprintf (make_file, "\trm -f lib6*-%s.*\n", testcase_name);
155 fprintf (make_file, "\trm -f lib7*-%s.*\n", testcase_name);
156 fprintf (make_file, "\trm -f lib8*-%s.*\n", testcase_name);
157 fprintf (make_file, "\trm -f lib9*-%s.*\n", testcase_name);
158 fprintf (make_file, "\trm -f %s %s %s %s.c\n", argv[0], testcase_name, linkfile_name, testcase_name);
159 fprintf (make_file, "\n");
160 fclose (make_file);
161 }
162
163 /* Generate the code for the libraries.
164 */
165 for (i=0; i < lib_num; i++) {
166
167 /* Generate the names for the library.
168 */
169 sprintf (file_name, "lib%2.2d-%s.c", i, testcase_name);
170 sprintf (file_name_core, "lib%2.2d-%s", i, testcase_name);
171
172 /* Generate the source code.
173 */
174 lib_file = fopen (file_name, "w");
175 fprintf (lib_file, "/* Shared library file number %d */\n", i);
176 fprintf (lib_file, "#include <stdio.h>\n\n");
177 fprintf (lib_file, "/* The following variables largely exist to bloat this library's debug info. */\n");
178 fprintf (lib_file, "static char c_static_buf_%d [100];\n", i);
179 for (i2=0; i2<NUMBER_OF_INT_VARS; i2++)
180 fprintf (lib_file, "int i_%d_%d;\n", i, i2);
181 fprintf (lib_file, "\nint r_%d ()\n", i);
182 fprintf (lib_file, "{\n");
183 for (i2=0; i2<NUMBER_OF_INT_VARS; i2++)
184 fprintf (lib_file, " i_%d_%d = %d*%d;\n", i, i2, i2, i2);
185 fprintf (lib_file, " return 1;\n");
186 fprintf (lib_file, "}\n\n");
187 fprintf (lib_file, "/* end of generated file */\n");
188 fclose (lib_file);
189
190 /* Add a linker options line
191 */
192 fprintf (link_file, "-l%2.2d-%s\n", i, testcase_name);
193 }
194
195 /* Generate the "main" file.
196 */
197 strcpy (mainfile_name, testcase_name);
198 strcat (mainfile_name, ".c");
199 main_file = fopen (mainfile_name, "w");
200 fprintf (main_file, "/* Generated test progam with %d shared libraries. */\n\n",
201 lib_num);
202 fprintf (main_file, "#include <stdio.h>\n\n");
203
204 for (i = 0; i < lib_num; i++) {
205 fprintf (main_file, "extern int r_%d();\n", i);
206 }
207
208 fprintf (main_file, "\n");
209 fprintf (main_file, "int main()\n");
210 fprintf (main_file, "{\n");
211 fprintf (main_file, " int accum;\n");
212 fprintf (main_file, " int lib_num = %d;\n", lib_num);
213
214 for (i = 0; i < lib_num; i++) {
215 fprintf (main_file, " accum += r_%d();\n", i);
216 }
217
218 fprintf (main_file, " printf( \"Final value: %%d, should be %%d\\n\", accum, lib_num );\n\n");
219 fprintf (main_file, " return 0;\n");
220 fprintf (main_file, "}\n\n");
221 fprintf (main_file, "/* end of generated file */\n");
222 fclose (main_file);
223
224 /* Finish up the link file and the build file
225 */
226 fclose (link_file);
227 }
228
229 /* End of file */
This page took 0.043737 seconds and 4 git commands to generate.