blob: 53422098368f40492dc1db374e0ab0cb9a7587a8 [file] [log] [blame]
H. Peter Anvinb20bc732017-03-07 19:23:03 -08001/* ----------------------------------------------------------------------- *
2 *
H. Peter Anvin (Intel)1df72632019-01-11 13:13:03 -08003 * Copyright 1996-2019 The NASM Authors - All Rights Reserved
H. Peter Anvinb20bc732017-03-07 19:23:03 -08004 * See the file AUTHORS included with the NASM distribution for
5 * the specific copyright holders.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following
9 * conditions are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 * ----------------------------------------------------------------------- */
33
34/*
35 * Parse and handle assembler directives
36 */
37
38#include "compiler.h"
39
H. Peter Anvinc2f3f262018-12-27 12:37:25 -080040#include "nctype.h"
H. Peter Anvinb20bc732017-03-07 19:23:03 -080041
42#include "nasm.h"
43#include "nasmlib.h"
H. Peter Anvin0a126062017-09-27 13:34:42 -070044#include "ilog2.h"
H. Peter Anvinb20bc732017-03-07 19:23:03 -080045#include "error.h"
H. Peter Anvin (Intel)6e9554f2020-06-14 23:21:44 -070046#include "floats.h"
H. Peter Anvinb20bc732017-03-07 19:23:03 -080047#include "stdscan.h"
48#include "preproc.h"
H. Peter Anvinb20bc732017-03-07 19:23:03 -080049#include "eval.h"
50#include "assemble.h"
51#include "outform.h"
52#include "listing.h"
53#include "labels.h"
54#include "iflag.h"
55
H. Peter Anvina7ecf262018-02-06 14:43:07 -080056struct cpunames {
57 const char *name;
58 unsigned int level;
59 /* Eventually a table of features */
60};
61
62static iflag_t get_cpu(const char *value)
H. Peter Anvinb20bc732017-03-07 19:23:03 -080063{
64 iflag_t r;
H. Peter Anvina7ecf262018-02-06 14:43:07 -080065 const struct cpunames *cpu;
66 static const struct cpunames cpunames[] = {
67 { "8086", IF_8086 },
68 { "186", IF_186 },
69 { "286", IF_286 },
70 { "386", IF_386 },
71 { "486", IF_486 },
72 { "586", IF_PENT },
73 { "pentium", IF_PENT },
74 { "pentiummmx", IF_PENT },
75 { "686", IF_P6 },
76 { "p6", IF_P6 },
77 { "ppro", IF_P6 },
78 { "pentiumpro", IF_P6 },
79 { "p2", IF_P6 }, /* +MMX */
80 { "pentiumii", IF_P6 },
81 { "p3", IF_KATMAI },
82 { "katmai", IF_KATMAI },
83 { "p4", IF_WILLAMETTE },
84 { "willamette", IF_WILLAMETTE },
85 { "prescott", IF_PRESCOTT },
86 { "x64", IF_X86_64 },
87 { "x86-64", IF_X86_64 },
88 { "ia64", IF_IA64 },
89 { "ia-64", IF_IA64 },
90 { "itanium", IF_IA64 },
91 { "itanic", IF_IA64 },
92 { "merced", IF_IA64 },
H. Peter Anvin (Intel)d13a6f92019-08-06 22:33:14 -070093 { "nehalem", IF_NEHALEM },
94 { "westmere", IF_WESTMERE },
95 { "sandybridge", IF_SANDYBRIDGE },
96 { "ivybridge", IF_FUTURE },
97 { "any", IF_ANY },
98 { "all", IF_ANY },
H. Peter Anvina7ecf262018-02-06 14:43:07 -080099 { "default", IF_PLEVEL },
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800100 { NULL, IF_PLEVEL } /* Error and final default entry */
101 };
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800102
Cyrill Gorcunov8a231082018-02-25 13:25:19 +0300103 iflag_clear_all(&r);
104
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800105 for (cpu = cpunames; cpu->name; cpu++) {
Cyrill Gorcunova7f318c2018-06-07 00:06:58 +0300106 if (!nasm_stricmp(value, cpu->name))
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800107 break;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800108 }
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800109
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800110 if (!cpu->name)
111 nasm_nonfatal("unknown 'cpu' type '%s'", value);
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800112
113 iflag_set_cpu(&r, cpu->level);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800114 return r;
115}
116
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800117static int get_bits(const char *value)
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800118{
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800119 int i = atoi(value);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800120
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800121 switch (i) {
122 case 16:
123 break; /* Always safe */
124 case 32:
125 if (!iflag_cpu_level_ok(&cpu, IF_386)) {
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300126 nasm_nonfatal("cannot specify 32-bit segment on processor below a 386");
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800127 i = 16;
128 }
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800129 break;
130 case 64:
131 if (!iflag_cpu_level_ok(&cpu, IF_X86_64)) {
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300132 nasm_nonfatal("cannot specify 64-bit segment on processor below an x86-64");
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800133 i = 16;
134 }
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800135 break;
136 default:
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800137 nasm_nonfatal("`%s' is not a valid segment size; must be 16, 32 or 64",
138 value);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800139 i = 16;
H. Peter Anvina7ecf262018-02-06 14:43:07 -0800140 break;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800141 }
142 return i;
143}
144
H. Peter Anvin5253f582017-04-03 00:09:58 -0700145static enum directive parse_directive_line(char **directive, char **value)
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800146{
147 char *p, *q, *buf;
148
149 buf = nasm_skip_spaces(*directive);
150
151 /*
152 * It should be enclosed in [ ].
153 * XXX: we don't check there is nothing else on the remainder of the
154 * line, except a possible comment.
155 */
156 if (*buf != '[')
157 return D_none;
158 q = strchr(buf, ']');
159 if (!q)
160 return D_corrupt;
161
162 /*
163 * Strip off the comments. XXX: this doesn't account for quoted
164 * strings inside a directive. We should really strip the
165 * comments in generic code, not here. While we're at it, it
166 * would be better to pass the backend a series of tokens instead
167 * of a raw string, and actually process quoted strings for it,
168 * like of like argv is handled in C.
169 */
170 p = strchr(buf, ';');
171 if (p) {
172 if (p < q) /* ouch! somewhere inside */
173 return D_corrupt;
174 *p = '\0';
175 }
176
177 /* no brace, no trailing spaces */
178 *q = '\0';
179 nasm_zap_spaces_rev(--q);
180
181 /* directive */
182 p = nasm_skip_spaces(++buf);
183 q = nasm_skip_word(p);
184 if (!q)
185 return D_corrupt; /* sigh... no value there */
186 *q = '\0';
187 *directive = p;
188
189 /* and value finally */
190 p = nasm_skip_spaces(++q);
191 *value = p;
192
H. Peter Anvin5253f582017-04-03 00:09:58 -0700193 return directive_find(*directive);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800194}
195
H. Peter Anvina6e26d92017-03-07 21:32:37 -0800196/*
197 * Process a line from the assembler and try to handle it if it
198 * is a directive. Return true if the line was handled (including
199 * if it was an error), false otherwise.
200 */
201bool process_directives(char *directive)
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800202{
H. Peter Anvin5253f582017-04-03 00:09:58 -0700203 enum directive d;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800204 char *value, *p, *q, *special;
205 struct tokenval tokval;
206 bool bad_param = false;
H. Peter Anvin98578072018-06-01 18:02:54 -0700207 enum label_type type;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800208
209 d = parse_directive_line(&directive, &value);
210
211 switch (d) {
212 case D_none:
213 return D_none; /* Not a directive */
214
215 case D_corrupt:
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300216 nasm_nonfatal("invalid directive line");
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800217 break;
218
219 default: /* It's a backend-specific directive */
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800220 switch (ofmt->directive(d, value)) {
H. Peter Anvine562b702017-03-07 22:40:00 -0800221 case DIRR_UNKNOWN:
222 goto unknown;
223 case DIRR_OK:
224 case DIRR_ERROR:
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800225 break;
H. Peter Anvine562b702017-03-07 22:40:00 -0800226 case DIRR_BADPARAM:
227 bad_param = true;
228 break;
229 default:
230 panic();
231 }
232 break;
233
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800234 case D_unknown:
H. Peter Anvine562b702017-03-07 22:40:00 -0800235 unknown:
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800236 nasm_nonfatal("unrecognized directive [%s]", directive);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800237 break;
238
239 case D_SEGMENT: /* [SEGMENT n] */
240 case D_SECTION:
241 {
H. Peter Anvine8001272017-09-27 14:22:16 -0700242 int sb = globalbits;
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800243 int32_t seg = ofmt->section(value, &sb);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800244
245 if (seg == NO_SEG) {
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800246 nasm_nonfatal("segment name `%s' not recognized", value);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800247 } else {
H. Peter Anvine8001272017-09-27 14:22:16 -0700248 globalbits = sb;
H. Peter Anvin892c4812018-05-30 14:43:46 -0700249 switch_segment(seg);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800250 }
251 break;
252 }
253
254 case D_SECTALIGN: /* [SECTALIGN n] */
255 {
256 expr *e;
257
258 if (*value) {
259 stdscan_reset();
260 stdscan_set(value);
261 tokval.t_type = TOKEN_INVALID;
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800262 e = evaluate(stdscan, NULL, &tokval, NULL, true, NULL);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800263 if (e) {
264 uint64_t align = e->value;
265
266 if (!is_power2(e->value)) {
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300267 nasm_nonfatal("segment alignment `%s' is not power of two",
268 value);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800269 } else if (align > UINT64_C(0x7fffffff)) {
270 /*
271 * FIXME: Please make some sane message here
272 * ofmt should have some 'check' method which
273 * would report segment alignment bounds.
274 */
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300275 nasm_nonfatal("absurdly large segment alignment `%s' (2^%d)",
276 value, ilog2_64(align));
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800277 }
278
279 /* callee should be able to handle all details */
280 if (location.segment != NO_SEG)
281 ofmt->sectalign(location.segment, align);
282 }
283 }
284 break;
285 }
286
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800287 case D_BITS: /* [BITS bits] */
288 globalbits = get_bits(value);
289 break;
290
H. Peter Anvin98578072018-06-01 18:02:54 -0700291 case D_GLOBAL: /* [GLOBAL|STATIC|EXTERN|COMMON symbol:special] */
292 type = LBL_GLOBAL;
293 goto symdef;
294 case D_STATIC:
295 type = LBL_STATIC;
296 goto symdef;
297 case D_EXTERN:
298 type = LBL_EXTERN;
299 goto symdef;
H. Peter Anvin90b1ccf2019-09-12 20:21:03 -0400300 case D_REQUIRED:
301 type = LBL_REQUIRED;
302 goto symdef;
H. Peter Anvin98578072018-06-01 18:02:54 -0700303 case D_COMMON:
304 type = LBL_COMMON;
305 goto symdef;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800306
H. Peter Anvin98578072018-06-01 18:02:54 -0700307 symdef:
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800308 {
H. Peter Anvin98578072018-06-01 18:02:54 -0700309 bool validid = true;
310 int64_t size = 0;
311 char *sizestr;
312 bool rn_error;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800313
H. Peter Anvin73482482018-06-11 14:54:14 -0700314 if (*value == '$')
315 value++; /* skip initial $ if present */
316
H. Peter Anvin98578072018-06-01 18:02:54 -0700317 q = value;
H. Peter Anvin13506202018-11-28 14:55:58 -0800318 if (!nasm_isidstart(*q)) {
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800319 validid = false;
H. Peter Anvin73482482018-06-11 14:54:14 -0700320 } else {
H. Peter Anvin98578072018-06-01 18:02:54 -0700321 q++;
H. Peter Anvin73482482018-06-11 14:54:14 -0700322 while (*q && *q != ':' && !nasm_isspace(*q)) {
H. Peter Anvin13506202018-11-28 14:55:58 -0800323 if (!nasm_isidchar(*q))
H. Peter Anvin73482482018-06-11 14:54:14 -0700324 validid = false;
325 q++;
326 }
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800327 }
328 if (!validid) {
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300329 nasm_nonfatal("identifier expected after %s, got `%s'",
330 directive, value);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800331 break;
332 }
333
H. Peter Anvin98578072018-06-01 18:02:54 -0700334 if (nasm_isspace(*q)) {
H. Peter Anvin3cb90682018-06-01 21:05:45 -0700335 *q++ = '\0';
336 sizestr = q = nasm_skip_spaces(q);
H. Peter Anvin98578072018-06-01 18:02:54 -0700337 q = strchr(q, ':');
338 } else {
339 sizestr = NULL;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800340 }
H. Peter Anvin98578072018-06-01 18:02:54 -0700341
H. Peter Anvin3cb90682018-06-01 21:05:45 -0700342 if (q && *q == ':') {
H. Peter Anvin98578072018-06-01 18:02:54 -0700343 *q++ = '\0';
344 special = q;
345 } else {
346 special = NULL;
347 }
348
349 if (type == LBL_COMMON) {
350 if (sizestr)
351 size = readnum(sizestr, &rn_error);
352 if (!sizestr || rn_error)
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300353 nasm_nonfatal("%s size specified in common declaration",
354 sizestr ? "invalid" : "no");
H. Peter Anvin98578072018-06-01 18:02:54 -0700355 } else if (sizestr) {
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300356 nasm_nonfatal("invalid syntax in %s declaration", directive);
H. Peter Anvin98578072018-06-01 18:02:54 -0700357 }
358
H. Peter Anvin98578072018-06-01 18:02:54 -0700359 if (!declare_label(value, type, special))
360 break;
361
H. Peter Anvin90b1ccf2019-09-12 20:21:03 -0400362 if (type == LBL_COMMON || type == LBL_EXTERN || type == LBL_REQUIRED)
H. Peter Anvinaf5f9182018-06-14 19:53:45 -0700363 define_label(value, 0, size, false);
H. Peter Anvin98578072018-06-01 18:02:54 -0700364
365 break;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800366 }
367
368 case D_ABSOLUTE: /* [ABSOLUTE address] */
369 {
370 expr *e;
371
372 stdscan_reset();
373 stdscan_set(value);
374 tokval.t_type = TOKEN_INVALID;
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800375 e = evaluate(stdscan, NULL, &tokval, NULL, true, NULL);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800376 if (e) {
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800377 if (!is_reloc(e)) {
378 nasm_nonfatal("cannot use non-relocatable expression as "
379 "ABSOLUTE address");
380 } else {
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800381 absolute.segment = reloc_seg(e);
382 absolute.offset = reloc_value(e);
383 }
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800384 } else if (pass_first()) {
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800385 absolute.offset = 0x100; /* don't go near zero in case of / */
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800386 } else {
387 nasm_nonfatal("invalid ABSOLUTE address");
388 }
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800389 in_absolute = true;
390 location.segment = NO_SEG;
H. Peter Anvin (Intel)415b6b32018-06-25 14:09:52 -0700391 location.offset = absolute.offset;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800392 break;
393 }
394
395 case D_DEBUG: /* [DEBUG] */
396 {
397 bool badid, overlong;
398 char debugid[128];
399
400 p = value;
401 q = debugid;
402 badid = overlong = false;
H. Peter Anvin13506202018-11-28 14:55:58 -0800403 if (!nasm_isidstart(*p)) {
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800404 badid = true;
405 } else {
406 while (*p && !nasm_isspace(*p)) {
407 if (q >= debugid + sizeof debugid - 1) {
408 overlong = true;
409 break;
410 }
H. Peter Anvin13506202018-11-28 14:55:58 -0800411 if (!nasm_isidchar(*p))
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800412 badid = true;
413 *q++ = *p++;
414 }
415 *q = 0;
416 }
417 if (badid) {
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800418 nasm_nonfatal("identifier expected after DEBUG");
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800419 break;
420 }
421 if (overlong) {
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800422 nasm_nonfatal("DEBUG identifier too long");
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800423 break;
424 }
425 p = nasm_skip_spaces(p);
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800426 if (pass_final())
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800427 dfmt->debug_directive(debugid, p);
428 break;
429 }
430
H. Peter Anvin (Intel)1df72632019-01-11 13:13:03 -0800431 case D_WARNING: /* [WARNING {push|pop|{+|-|*}warn-name}] */
432 value = nasm_skip_spaces(value);
433 if ((*value | 0x20) == 'p') {
434 if (!nasm_stricmp(value, "push"))
435 push_warnings();
436 else if (!nasm_stricmp(value, "pop"))
437 pop_warnings();
438 }
H. Peter Anvin (Intel)723ab482018-12-13 21:53:31 -0800439 set_warning_status(value);
H. Peter Anvinb2047cb2017-03-08 01:26:40 -0800440 break;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800441
442 case D_CPU: /* [CPU] */
443 cpu = get_cpu(value);
444 break;
445
446 case D_LIST: /* [LIST {+|-}] */
447 value = nasm_skip_spaces(value);
448 if (*value == '+') {
449 user_nolist = false;
450 } else {
451 if (*value == '-') {
452 user_nolist = true;
453 } else {
454 bad_param = true;
455 }
456 }
457 break;
458
459 case D_DEFAULT: /* [DEFAULT] */
460 stdscan_reset();
461 stdscan_set(value);
462 tokval.t_type = TOKEN_INVALID;
463 if (stdscan(NULL, &tokval) != TOKEN_INVALID) {
464 switch (tokval.t_integer) {
465 case S_REL:
466 globalrel = 1;
467 break;
468 case S_ABS:
469 globalrel = 0;
470 break;
471 case P_BND:
472 globalbnd = 1;
473 break;
474 case P_NOBND:
475 globalbnd = 0;
476 break;
477 default:
478 bad_param = true;
479 break;
480 }
481 } else {
482 bad_param = true;
483 }
484 break;
485
486 case D_FLOAT:
487 if (float_option(value)) {
H. Peter Anvin (Intel)e55d03d2018-12-18 11:12:46 -0800488 nasm_nonfatal("unknown 'float' directive: %s", value);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800489 }
490 break;
491
492 case D_PRAGMA:
493 process_pragma(value);
494 break;
495 }
496
497
498 /* A common error message */
499 if (bad_param) {
Cyrill Gorcunov7c5de5b2018-12-01 14:17:40 +0300500 nasm_nonfatal("invalid parameter to [%s] directive", directive);
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800501 }
502
H. Peter Anvina6e26d92017-03-07 21:32:37 -0800503 return d != D_none;
H. Peter Anvinb20bc732017-03-07 19:23:03 -0800504}