annotate gcc/config/gcn/mkoffload.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* Offload image generation tool for AMD GCN.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 Copyright (C) 2014-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 This file is part of GCC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 under the terms of the GNU General Public License as published
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 by the Free Software Foundation; either version 3, or (at your
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 option) any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 /* Munges GCN assembly into a C source file defining the GCN code as a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 string.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 This is not a complete assembler. We presume the source is well
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 formed from the compiler and can die horribly if it is not. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 #include "config.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #include "system.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include "coretypes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #include "obstack.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 #include "diagnostic.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #include "intl.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 #include <libgen.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 #include "collect-utils.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 #include "gomp-constants.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 const char tool_name[] = "gcn mkoffload";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 /* Files to unlink. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 static const char *gcn_s1_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 static const char *gcn_s2_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 static const char *gcn_o_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 static const char *gcn_cfile_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 /* Delete tempfiles. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 tool_cleanup (bool from_signal ATTRIBUTE_UNUSED)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 if (gcn_cfile_name)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 maybe_unlink (gcn_cfile_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 if (gcn_s1_name)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 maybe_unlink (gcn_s1_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 if (gcn_s2_name)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 maybe_unlink (gcn_s2_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 if (gcn_o_name)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 maybe_unlink (gcn_o_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 mkoffload_cleanup (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 tool_cleanup (false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 /* Unlink FILE unless requested otherwise. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 maybe_unlink (const char *file)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 if (!save_temps)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 if (unlink_if_ordinary (file) && errno != ENOENT)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 fatal_error (input_location, "deleting file %s: %m", file);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 else if (verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 fprintf (stderr, "[Leaving %s]\n", file);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 /* Add or change the value of an environment variable, outputting the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 change to standard error if in verbose mode. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 xputenv (const char *string)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 if (verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 fprintf (stderr, "%s\n", string);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 putenv (CONST_CAST (char *, string));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 /* Read the whole input file. It will be NUL terminated (but
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 remember, there could be a NUL in the file itself. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 static const char *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 read_file (FILE *stream, size_t *plen)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 size_t alloc = 16384;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 size_t base = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 char *buffer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 if (!fseek (stream, 0, SEEK_END))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 /* Get the file size. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 long s = ftell (stream);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 if (s >= 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 alloc = s + 100;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 fseek (stream, 0, SEEK_SET);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 buffer = XNEWVEC (char, alloc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 for (;;)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 size_t n = fread (buffer + base, 1, alloc - base - 1, stream);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 if (!n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 base += n;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 if (base + 1 == alloc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 alloc *= 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 buffer = XRESIZEVEC (char, buffer, alloc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 buffer[base] = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 *plen = base;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 return buffer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 /* Parse STR, saving found tokens into PVALUES and return their number.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 Tokens are assumed to be delimited by ':'. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 static unsigned
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 parse_env_var (const char *str, char ***pvalues)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 const char *curval, *nextval;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 char **values;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 unsigned num = 1, i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 curval = strchr (str, ':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 while (curval)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 num++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 curval = strchr (curval + 1, ':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 values = (char **) xmalloc (num * sizeof (char *));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 curval = str;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 nextval = strchr (curval, ':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 if (nextval == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 nextval = strchr (curval, '\0');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 for (i = 0; i < num; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 int l = nextval - curval;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 values[i] = (char *) xmalloc (l + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 memcpy (values[i], curval, l);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 values[i][l] = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 curval = nextval + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 nextval = strchr (curval, ':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 if (nextval == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 nextval = strchr (curval, '\0');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 *pvalues = values;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 return num;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 /* Auxiliary function that frees elements of PTR and PTR itself.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 N is number of elements to be freed. If PTR is NULL, nothing is freed.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 If an element is NULL, subsequent elements are not freed. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 free_array_of_ptrs (void **ptr, unsigned n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 unsigned i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 if (!ptr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 for (i = 0; i < n; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 if (!ptr[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 free (ptr[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 free (ptr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 /* Check whether NAME can be accessed in MODE. This is like access,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 except that it never considers directories to be executable. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 static int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 access_check (const char *name, int mode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 if (mode == X_OK)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 struct stat st;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 if (stat (name, &st) < 0 || S_ISDIR (st.st_mode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 return access (name, mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 /* Parse an input assembler file, extract the offload tables etc.,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 and output (1) the assembler code, minus the tables (which can contain
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 problematic relocations), and (2) a C file with the offload tables
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 encoded as structured data. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 process_asm (FILE *in, FILE *out, FILE *cfile)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 int fn_count = 0, var_count = 0, dims_count = 0, regcount_count = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 struct obstack fns_os, vars_os, varsizes_os, dims_os, regcounts_os;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 obstack_init (&fns_os);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 obstack_init (&vars_os);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 obstack_init (&varsizes_os);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 obstack_init (&dims_os);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 obstack_init (&regcounts_os);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 struct oaccdims
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 int d[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 char *name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 } dim;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 struct regcount
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 int sgpr_count;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 int vgpr_count;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 char *kernel_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 } regcount;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 /* Always add _init_array and _fini_array as kernels. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 obstack_ptr_grow (&fns_os, xstrdup ("_init_array"));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 obstack_ptr_grow (&fns_os, xstrdup ("_fini_array"));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 fn_count += 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 char buf[1000];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 enum { IN_CODE, IN_AMD_KERNEL_CODE_T, IN_VARS, IN_FUNCS } state = IN_CODE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 while (fgets (buf, sizeof (buf), in))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 switch (state)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 case IN_CODE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 if (sscanf (buf, " ;; OPENACC-DIMS: %d, %d, %d : %ms\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 &dim.d[0], &dim.d[1], &dim.d[2], &dim.name) == 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 obstack_grow (&dims_os, &dim, sizeof (dim));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 dims_count++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 else if (sscanf (buf, " .amdgpu_hsa_kernel %ms\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 &regcount.kernel_name) == 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 case IN_AMD_KERNEL_CODE_T:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 gcc_assert (regcount.kernel_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 if (sscanf (buf, " wavefront_sgpr_count = %d\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 &regcount.sgpr_count) == 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 else if (sscanf (buf, " workitem_vgpr_count = %d\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 &regcount.vgpr_count) == 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 case IN_VARS:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 char *varname;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 unsigned varsize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 if (sscanf (buf, " .8byte %ms\n", &varname))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 obstack_ptr_grow (&vars_os, varname);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 fgets (buf, sizeof (buf), in);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 if (!sscanf (buf, " .8byte %u\n", &varsize))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 obstack_int_grow (&varsizes_os, varsize);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 var_count++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 /* The HSA Runtime cannot locate the symbol if it is not
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 exported from the kernel. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 fprintf (out, "\t.global %s\n", varname);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 case IN_FUNCS:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 char *funcname;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 if (sscanf (buf, "\t.8byte\t%ms\n", &funcname))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 obstack_ptr_grow (&fns_os, funcname);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 fn_count++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 char dummy;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 if (sscanf (buf, " .section .gnu.offload_vars%c", &dummy) > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 state = IN_VARS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 else if (sscanf (buf, " .section .gnu.offload_funcs%c", &dummy) > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 state = IN_FUNCS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 else if (sscanf (buf, " .amd_kernel_code_%c", &dummy) > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 state = IN_AMD_KERNEL_CODE_T;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 regcount.sgpr_count = regcount.vgpr_count = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 else if (sscanf (buf, " .section %c", &dummy) > 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 || sscanf (buf, " .text%c", &dummy) > 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 || sscanf (buf, " .bss%c", &dummy) > 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 || sscanf (buf, " .data%c", &dummy) > 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 || sscanf (buf, " .ident %c", &dummy) > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 state = IN_CODE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 else if (sscanf (buf, " .end_amd_kernel_code_%c", &dummy) > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 state = IN_CODE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 gcc_assert (regcount.kernel_name != NULL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 && regcount.sgpr_count >= 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 && regcount.vgpr_count >= 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 obstack_grow (&regcounts_os, &regcount, sizeof (regcount));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 regcount_count++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 regcount.kernel_name = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 regcount.sgpr_count = regcount.vgpr_count = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 if (state == IN_CODE || state == IN_AMD_KERNEL_CODE_T)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 fputs (buf, out);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 char **fns = XOBFINISH (&fns_os, char **);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 struct oaccdims *dims = XOBFINISH (&dims_os, struct oaccdims *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 struct regcount *regcounts = XOBFINISH (&regcounts_os, struct regcount *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 fprintf (cfile, "#include <stdlib.h>\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 fprintf (cfile, "#include <stdbool.h>\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 char **vars = XOBFINISH (&vars_os, char **);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 unsigned *varsizes = XOBFINISH (&varsizes_os, unsigned *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 fprintf (cfile,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 "static const struct global_var_info {\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 " const char *name;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 " void *address;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 "} vars[] = {\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 for (i = 0; i < var_count; ++i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 const char *sep = i < var_count - 1 ? "," : " ";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 fprintf (cfile, " { \"%s\", NULL }%s /* size: %u */\n", vars[i], sep,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 varsizes[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 fprintf (cfile, "};\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 obstack_free (&vars_os, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 obstack_free (&varsizes_os, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 /* Dump out function idents. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 fprintf (cfile, "static const struct hsa_kernel_description {\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 " const char *name;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 " int oacc_dims[3];\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 " int sgpr_count;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 " int vgpr_count;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 "} gcn_kernels[] = {\n ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 dim.d[0] = dim.d[1] = dim.d[2] = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 const char *comma;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 for (comma = "", i = 0; i < fn_count; comma = ",\n ", i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 /* Find if we recorded dimensions for this function. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 int *d = dim.d; /* Previously zeroed. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 int sgpr_count = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 int vgpr_count = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 for (int j = 0; j < dims_count; j++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 if (strcmp (fns[i], dims[j].name) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 d = dims[j].d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 for (int j = 0; j < regcount_count; j++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 if (strcmp (fns[i], regcounts[j].kernel_name) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 sgpr_count = regcounts[j].sgpr_count;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 vgpr_count = regcounts[j].vgpr_count;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 fprintf (cfile, "%s{\"%s\", {%d, %d, %d}, %d, %d}", comma,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 fns[i], d[0], d[1], d[2], sgpr_count, vgpr_count);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 free (fns[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 fprintf (cfile, "\n};\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 obstack_free (&fns_os, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 for (i = 0; i < dims_count; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 free (dims[i].name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 for (i = 0; i < regcount_count; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 free (regcounts[i].kernel_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 obstack_free (&dims_os, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 obstack_free (&regcounts_os, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 /* Embed an object file into a C source file. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 process_obj (FILE *in, FILE *cfile)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 size_t len = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 const char *input = read_file (in, &len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 /* Dump out an array containing the binary.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 FIXME: do this with objcopy. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 fprintf (cfile, "static unsigned char gcn_code[] = {");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 for (size_t i = 0; i < len; i += 17)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 fprintf (cfile, "\n\t");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 for (size_t j = i; j < i + 17 && j < len; j++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 fprintf (cfile, "%3u,", (unsigned char) input[j]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 fprintf (cfile, "\n};\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 fprintf (cfile,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 "static const struct gcn_image {\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 " size_t size;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 " void *image;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 "} gcn_image = {\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 " %zu,\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 " gcn_code\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 "};\n\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 fprintf (cfile,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 "static const struct gcn_image_desc {\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 " const struct gcn_image *gcn_image;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 " unsigned kernel_count;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 " const struct hsa_kernel_description *kernel_infos;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 " unsigned global_variable_count;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 " const struct global_var_info *global_variables;\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 "} target_data = {\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 " &gcn_image,\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 " sizeof (gcn_kernels) / sizeof (gcn_kernels[0]),\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 " gcn_kernels,\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 " sizeof (vars) / sizeof (vars[0]),\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 " vars\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 "};\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 fprintf (cfile,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 "#ifdef __cplusplus\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 "extern \"C\" {\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 "#endif\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 "extern void GOMP_offload_register_ver"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 " (unsigned, const void *, int, const void *);\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 "extern void GOMP_offload_unregister_ver"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 " (unsigned, const void *, int, const void *);\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 "#ifdef __cplusplus\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 "}\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 "#endif\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 fprintf (cfile, "extern const void *const __OFFLOAD_TABLE__[];\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 fprintf (cfile, "static __attribute__((constructor)) void init (void)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 "{\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 " GOMP_offload_register_ver (%#x, __OFFLOAD_TABLE__,"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 " %d/*GCN*/, &target_data);\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 "};\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 GOMP_VERSION_PACK (GOMP_VERSION, GOMP_VERSION_GCN),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 GOMP_DEVICE_GCN);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 fprintf (cfile, "static __attribute__((destructor)) void fini (void)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 "{\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 " GOMP_offload_unregister_ver (%#x, __OFFLOAD_TABLE__,"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 " %d/*GCN*/, &target_data);\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 "};\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 GOMP_VERSION_PACK (GOMP_VERSION, GOMP_VERSION_GCN),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 GOMP_DEVICE_GCN);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 /* Compile a C file using the host compiler. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 compile_native (const char *infile, const char *outfile, const char *compiler)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 const char *collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 if (!collect_gcc_options)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 fatal_error (input_location,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 "environment variable COLLECT_GCC_OPTIONS must be set");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 struct obstack argv_obstack;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 obstack_init (&argv_obstack);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 obstack_ptr_grow (&argv_obstack, compiler);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 if (save_temps)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 obstack_ptr_grow (&argv_obstack, "-save-temps");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 if (verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 obstack_ptr_grow (&argv_obstack, "-v");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 switch (offload_abi)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 case OFFLOAD_ABI_LP64:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 obstack_ptr_grow (&argv_obstack, "-m64");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 case OFFLOAD_ABI_ILP32:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 obstack_ptr_grow (&argv_obstack, "-m32");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 obstack_ptr_grow (&argv_obstack, infile);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 obstack_ptr_grow (&argv_obstack, "-c");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 obstack_ptr_grow (&argv_obstack, "-o");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 obstack_ptr_grow (&argv_obstack, outfile);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 obstack_ptr_grow (&argv_obstack, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 const char **new_argv = XOBFINISH (&argv_obstack, const char **);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 obstack_free (&argv_obstack, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 main (int argc, char **argv)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 FILE *in = stdin;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 FILE *out = stdout;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 FILE *cfile = stdout;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 const char *outname = 0, *offloadsrc = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 progname = "mkoffload";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 diagnostic_initialize (global_dc, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 if (atexit (mkoffload_cleanup) != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 fatal_error (input_location, "atexit failed");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 char *collect_gcc = getenv ("COLLECT_GCC");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 if (collect_gcc == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 fatal_error (input_location, "COLLECT_GCC must be set.");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 const char *gcc_path = dirname (ASTRDUP (collect_gcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 const char *gcc_exec = basename (ASTRDUP (collect_gcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 size_t len = (strlen (gcc_path) + 1 + strlen (GCC_INSTALL_NAME) + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 char *driver = XALLOCAVEC (char, len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544 if (strcmp (gcc_exec, collect_gcc) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 /* collect_gcc has no path, so it was found in PATH. Make sure we also
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 find accel-gcc in PATH. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 gcc_path = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 int driver_used = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 if (gcc_path != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 driver_used = sprintf (driver, "%s/", gcc_path);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 sprintf (driver + driver_used, "%s", GCC_INSTALL_NAME);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 bool found = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 if (gcc_path == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 found = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 else if (access_check (driver, X_OK) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 found = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 /* Don't use alloca pointer with XRESIZEVEC. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 driver = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 /* Look in all COMPILER_PATHs for GCC_INSTALL_NAME. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 char **paths = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 unsigned n_paths;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 n_paths = parse_env_var (getenv ("COMPILER_PATH"), &paths);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567 for (unsigned i = 0; i < n_paths; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569 len = strlen (paths[i]) + 1 + strlen (GCC_INSTALL_NAME) + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 driver = XRESIZEVEC (char, driver, len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 sprintf (driver, "%s/%s", paths[i], GCC_INSTALL_NAME);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 if (access_check (driver, X_OK) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 found = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 free_array_of_ptrs ((void **) paths, n_paths);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 if (!found)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 fatal_error (input_location,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 "offload compiler %s not found", GCC_INSTALL_NAME);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 /* We may be called with all the arguments stored in some file and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 passed with @file. Expand them into argv before processing. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 expandargv (&argc, &argv);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 /* Scan the argument vector. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 bool fopenmp = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 bool fopenacc = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 for (int i = 1; i < argc; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 #define STR "-foffload-abi="
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 if (strncmp (argv[i], STR, strlen (STR)) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 if (strcmp (argv[i] + strlen (STR), "lp64") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 offload_abi = OFFLOAD_ABI_LP64;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 else if (strcmp (argv[i] + strlen (STR), "ilp32") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600 offload_abi = OFFLOAD_ABI_ILP32;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 fatal_error (input_location,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 "unrecognizable argument of option " STR);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 #undef STR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 else if (strcmp (argv[i], "-fopenmp") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 fopenmp = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 else if (strcmp (argv[i], "-fopenacc") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 fopenacc = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 else if (strcmp (argv[i], "-save-temps") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 save_temps = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 else if (strcmp (argv[i], "-v") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 verbose = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 if (!(fopenacc ^ fopenmp))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 fatal_error (input_location, "either -fopenacc or -fopenmp must be set");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 const char *abi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 switch (offload_abi)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 case OFFLOAD_ABI_LP64:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622 abi = "-m64";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 case OFFLOAD_ABI_ILP32:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 abi = "-m32";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 gcn_s1_name = make_temp_file (".mkoffload.1.s");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 gcn_s2_name = make_temp_file (".mkoffload.2.s");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 gcn_o_name = make_temp_file (".mkoffload.hsaco");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 gcn_cfile_name = make_temp_file (".c");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 /* Build arguments for compiler pass. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 struct obstack cc_argv_obstack;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 obstack_init (&cc_argv_obstack);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639 obstack_ptr_grow (&cc_argv_obstack, driver);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 obstack_ptr_grow (&cc_argv_obstack, "-S");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 if (save_temps)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 obstack_ptr_grow (&cc_argv_obstack, "-save-temps");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 if (verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 obstack_ptr_grow (&cc_argv_obstack, "-v");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 obstack_ptr_grow (&cc_argv_obstack, abi);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 obstack_ptr_grow (&cc_argv_obstack, "-xlto");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 if (fopenmp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 obstack_ptr_grow (&cc_argv_obstack, "-mgomp");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 for (int ix = 1; ix != argc; ix++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 if (!strcmp (argv[ix], "-o") && ix + 1 != argc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 outname = argv[++ix];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 obstack_ptr_grow (&cc_argv_obstack, argv[ix]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 if (argv[ix][0] != '-')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 offloadsrc = argv[ix];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 obstack_ptr_grow (&cc_argv_obstack, "-o");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 obstack_ptr_grow (&cc_argv_obstack, gcn_s1_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666 obstack_ptr_grow (&cc_argv_obstack,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 concat ("-mlocal-symbol-id=", offloadsrc, NULL));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 obstack_ptr_grow (&cc_argv_obstack, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 const char **cc_argv = XOBFINISH (&cc_argv_obstack, const char **);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 /* Build arguments for assemble/link pass. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 struct obstack ld_argv_obstack;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 obstack_init (&ld_argv_obstack);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 obstack_ptr_grow (&ld_argv_obstack, driver);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 obstack_ptr_grow (&ld_argv_obstack, gcn_s2_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 obstack_ptr_grow (&ld_argv_obstack, "-lgomp");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678 for (int i = 1; i < argc; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679 if (strncmp (argv[i], "-l", 2) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 || strncmp (argv[i], "-Wl", 3) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 || strncmp (argv[i], "-march", 6) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 obstack_ptr_grow (&ld_argv_obstack, argv[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 obstack_ptr_grow (&ld_argv_obstack, "-o");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 obstack_ptr_grow (&ld_argv_obstack, gcn_o_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 obstack_ptr_grow (&ld_argv_obstack, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 const char **ld_argv = XOBFINISH (&ld_argv_obstack, const char **);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689 /* Clean up unhelpful environment variables. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 char *execpath = getenv ("GCC_EXEC_PREFIX");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 char *cpath = getenv ("COMPILER_PATH");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 char *lpath = getenv ("LIBRARY_PATH");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693 unsetenv ("GCC_EXEC_PREFIX");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 unsetenv ("COMPILER_PATH");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695 unsetenv ("LIBRARY_PATH");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 /* Run the compiler pass. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 fork_execute (cc_argv[0], CONST_CAST (char **, cc_argv), true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 obstack_free (&cc_argv_obstack, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701 in = fopen (gcn_s1_name, "r");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 if (!in)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703 fatal_error (input_location, "cannot open intermediate gcn asm file");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 out = fopen (gcn_s2_name, "w");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 if (!out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 fatal_error (input_location, "cannot open '%s'", gcn_s2_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 cfile = fopen (gcn_cfile_name, "w");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 if (!cfile)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 fatal_error (input_location, "cannot open '%s'", gcn_cfile_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 process_asm (in, out, cfile);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 fclose (in);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716 fclose (out);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718 /* Run the assemble/link pass. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719 fork_execute (ld_argv[0], CONST_CAST (char **, ld_argv), true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 obstack_free (&ld_argv_obstack, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722 in = fopen (gcn_o_name, "r");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 if (!in)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724 fatal_error (input_location, "cannot open intermediate gcn obj file");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 process_obj (in, cfile);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 fclose (in);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729 fclose (cfile);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 xputenv (concat ("GCC_EXEC_PREFIX=", execpath, NULL));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732 xputenv (concat ("COMPILER_PATH=", cpath, NULL));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 xputenv (concat ("LIBRARY_PATH=", lpath, NULL));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 compile_native (gcn_cfile_name, outname, collect_gcc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 }