]>
Commit | Line | Data |
---|---|---|
c03ba38c | 1 | 2002-11-22 Jakub Jelinek <jakub@redhat.com> |
2 | ||
3 | * ldgram.y (sect_constraint): New. | |
4 | (ONLY_IF_RO, ONLY_IF_RW): New tokens. | |
5 | (section): Add sect_constraint. Pass additional argument | |
6 | to lang_enter_output_section_statement. | |
7 | * mri.c (mri_draw_tree): Pass additional argument to | |
8 | lang_enter_output_section_statement. | |
9 | * emultempl/pe.em (place_orphan): Likewise. | |
10 | (output_prev_sec_find): Disregard output section statements with | |
11 | constraint == -1. | |
12 | * emultempl/mmo.em (output_prev_sec_find): Likewise. | |
13 | (mmo_place_orphan): Pass additional argument to | |
14 | lang_enter_output_section_statement. | |
15 | * emultempl/elf32.em (output_prev_sec_find): Disregard output section | |
16 | statements with constraint == -1. | |
17 | (place_orphan): Pass additional argument to | |
18 | lang_enter_output_section_statement. | |
19 | * ldlang.c (lang_enter_overlay_section): Likewise. | |
20 | (lang_output_section_find_1): New. | |
21 | (lang_output_section_find): Use it. | |
22 | (lang_output_section_statement_lookup_1): New. | |
23 | (lang_output_section_statement_lookup): Use it. | |
24 | (check_section_callback, check_input_sections): New. | |
25 | (map_input_to_output_sections): Check if all input sections | |
26 | are readonly if ONLY_IF_RO or ONLY_IF_RW was seen. | |
27 | (strip_excluded_output_sections): Disregard output section statements | |
28 | with constraint == -1. | |
29 | (lang_record_phdrs): Likewise. | |
30 | (lang_enter_output_section_statement): Add constraint argument. | |
31 | Use lang_output_section_statement_lookup_1. | |
32 | * ldlang.h (lang_output_section_statement_type): Add constraint | |
33 | and all_input_readonly fields. | |
34 | (lang_enter_output_section_statement): Adjust prototype. | |
35 | * ldlex.l (ONLY_IF_RO, ONLY_IF_RW): New tokens. | |
36 | * scripttempl/elf.sc (.eh_frame, .gcc_except_table): Move into text | |
37 | segment if all input sections are readonly. | |
38 | ||
39 | --- binutils-2.13.90.0.16/ld/ldgram.y.jj 2002-10-14 13:30:34.000000000 +0200 | |
40 | +++ binutils-2.13.90.0.16/ld/ldgram.y 2002-11-22 22:27:18.000000000 +0100 | |
41 | @@ -143,14 +143,14 @@ static int error_index; | |
42 | %token ORIGIN FILL | |
43 | %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS | |
44 | %token ALIGNMOD AT PROVIDE | |
45 | -%type <token> assign_op atype attributes_opt | |
46 | +%type <token> assign_op atype attributes_opt sect_constraint | |
47 | %type <name> filename | |
48 | %token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K | |
49 | %token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL | |
50 | %token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START | |
51 | %token <name> VERS_TAG VERS_IDENTIFIER | |
52 | %token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT | |
53 | -%token KEEP | |
54 | +%token KEEP ONLY_IF_RO ONLY_IF_RW | |
55 | %token EXCLUDE_FILE | |
56 | %type <versyms> vers_defns | |
57 | %type <versnode> vers_tag | |
58 | @@ -828,21 +828,28 @@ opt_at: | |
59 | | { $$ = 0; } | |
60 | ; | |
61 | ||
62 | +sect_constraint: | |
63 | + ONLY_IF_RO { $$ = ONLY_IF_RO; } | |
64 | + | ONLY_IF_RW { $$ = ONLY_IF_RW; } | |
65 | + | { $$ = 0; } | |
66 | + ; | |
67 | + | |
68 | section: NAME { ldlex_expression(); } | |
69 | opt_exp_with_type | |
70 | opt_at { ldlex_popstate (); ldlex_script (); } | |
71 | + sect_constraint | |
72 | '{' | |
73 | { | |
74 | lang_enter_output_section_statement($1, $3, | |
75 | sectype, | |
76 | - 0, 0, 0, $4); | |
77 | + 0, 0, 0, $4, $6); | |
78 | } | |
79 | statement_list_opt | |
80 | '}' { ldlex_popstate (); ldlex_expression (); } | |
81 | memspec_opt memspec_at_opt phdr_opt fill_opt | |
82 | { | |
83 | ldlex_popstate (); | |
84 | - lang_leave_output_section_statement ($14, $11, $13, $12); | |
85 | + lang_leave_output_section_statement ($15, $12, $14, $13); | |
86 | } | |
87 | opt_comma | |
88 | {} | |
89 | --- binutils-2.13.90.0.16/ld/mri.c.jj 2002-10-31 19:10:42.000000000 +0100 | |
90 | +++ binutils-2.13.90.0.16/ld/mri.c 2002-11-22 18:38:27.000000000 +0100 | |
91 | @@ -237,7 +237,7 @@ mri_draw_tree () | |
92 | lang_enter_output_section_statement (p->name, base, | |
93 | p->ok_to_load ? 0 : noload_section, | |
94 | 1, align, subalign, | |
95 | - (etree_type *) NULL); | |
96 | + (etree_type *) NULL, 0); | |
97 | base = 0; | |
98 | tmp = (struct wildcard_list *) xmalloc (sizeof *tmp); | |
99 | tmp->next = NULL; | |
100 | --- binutils-2.13.90.0.16/ld/emultempl/mmo.em.jj 2002-07-30 16:20:15.000000000 +0200 | |
101 | +++ binutils-2.13.90.0.16/ld/emultempl/mmo.em 2002-11-22 22:42:44.000000000 +0100 | |
102 | @@ -56,6 +56,8 @@ output_prev_sec_find (os) | |
103 | u = lookup->next) | |
104 | { | |
105 | lookup = &u->output_section_statement; | |
106 | + if (lookup->constraint == -1) | |
107 | + continue; | |
108 | if (lookup == os) | |
109 | break; | |
110 | if (lookup->bfd_section != NULL | |
111 | @@ -141,7 +143,7 @@ mmo_place_orphan (file, s) | |
112 | (bfd_vma) 0, | |
113 | (etree_type *) NULL, | |
114 | (etree_type *) NULL, | |
115 | - (etree_type *) NULL); | |
116 | + (etree_type *) NULL, 0); | |
117 | ||
118 | lang_add_section (&os->children, s, os, file); | |
119 | ||
120 | --- binutils-2.13.90.0.16/ld/emultempl/pe.em.jj 2002-11-21 15:58:51.000000000 +0100 | |
121 | +++ binutils-2.13.90.0.16/ld/emultempl/pe.em 2002-11-22 22:43:02.000000000 +0100 | |
122 | @@ -1489,6 +1489,8 @@ output_prev_sec_find (os) | |
123 | u = lookup->next) | |
124 | { | |
125 | lookup = &u->output_section_statement; | |
126 | + if (lookup->constraint == -1) | |
127 | + continue; | |
128 | if (lookup == os) | |
129 | return s; | |
130 | ||
131 | @@ -1655,7 +1657,7 @@ gld_${EMULATION_NAME}_place_orphan (file | |
132 | (bfd_vma) 0, | |
133 | (etree_type *) NULL, | |
134 | (etree_type *) NULL, | |
135 | - (etree_type *) NULL); | |
136 | + (etree_type *) NULL, 0); | |
137 | ||
138 | lang_add_section (&add_child, s, os, file); | |
139 | ||
140 | --- binutils-2.13.90.0.16/ld/emultempl/elf32.em.jj 2002-10-31 19:10:44.000000000 +0100 | |
141 | +++ binutils-2.13.90.0.16/ld/emultempl/elf32.em 2002-11-22 22:42:16.000000000 +0100 | |
142 | @@ -1009,7 +1009,8 @@ output_rel_find (sec) | |
143 | for (u = lang_output_section_statement.head; u; u = lookup->next) | |
144 | { | |
145 | lookup = &u->output_section_statement; | |
146 | - if (strncmp (".rel", lookup->name, 4) == 0) | |
147 | + if (lookup->constraint != -1 | |
148 | + && strncmp (".rel", lookup->name, 4) == 0) | |
149 | { | |
150 | /* Don't place after .rel.plt as doing so results in wrong | |
151 | dynamic tags. Also, place allocated reloc sections before | |
152 | @@ -1236,7 +1237,7 @@ gld${EMULATION_NAME}_place_orphan (file, | |
153 | (bfd_vma) 0, | |
154 | (etree_type *) NULL, | |
155 | (etree_type *) NULL, | |
156 | - (etree_type *) NULL); | |
157 | + (etree_type *) NULL, 0); | |
158 | ||
159 | lang_add_section (&os->children, s, os, file); | |
160 | ||
161 | --- binutils-2.13.90.0.16/ld/scripttempl/elf.sc.jj 2002-09-25 11:21:42.000000000 +0200 | |
162 | +++ binutils-2.13.90.0.16/ld/scripttempl/elf.sc 2002-11-22 22:35:47.000000000 +0100 | |
163 | @@ -280,6 +280,8 @@ cat <<EOF | |
164 | ${CREATE_SHLIB-${SBSS2}} | |
165 | ${OTHER_READONLY_SECTIONS} | |
166 | .eh_frame_hdr : { *(.eh_frame_hdr) } | |
167 | + .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) } | |
168 | + .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table) } | |
169 | ||
170 | /* Adjust the address for the data segment. We want to adjust up to | |
171 | the same address within the page on the next page up. */ | |
172 | @@ -312,8 +314,8 @@ cat <<EOF | |
173 | .data1 ${RELOCATING-0} : { *(.data1) } | |
174 | .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) } | |
175 | .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} } | |
176 | - .eh_frame ${RELOCATING-0} : { KEEP (*(.eh_frame)) } | |
177 | - .gcc_except_table ${RELOCATING-0} : { *(.gcc_except_table) } | |
178 | + .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) } | |
179 | + .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { *(.gcc_except_table) } | |
180 | ${WRITABLE_RODATA+${RODATA}} | |
181 | ${OTHER_READWRITE_SECTIONS} | |
182 | ${TEXT_DYNAMIC-${DYNAMIC}} | |
183 | --- binutils-2.13.90.0.16/ld/ldlang.h.jj 2002-10-10 00:53:07.000000000 +0200 | |
184 | +++ binutils-2.13.90.0.16/ld/ldlang.h 2002-11-22 22:27:37.000000000 +0100 | |
185 | @@ -132,6 +132,8 @@ typedef struct lang_output_section_state | |
186 | ||
187 | int subsection_alignment; /* alignment of components */ | |
188 | int section_alignment; /* alignment of start of section */ | |
189 | + int constraint; | |
190 | + boolean all_input_readonly; | |
191 | ||
192 | union etree_union *load_base; | |
193 | ||
194 | @@ -385,7 +387,7 @@ extern lang_output_section_statement_typ | |
195 | bfd_vma block_value, | |
196 | etree_type *align, | |
197 | etree_type *subalign, | |
198 | - etree_type *)); | |
199 | + etree_type *, int)); | |
200 | extern void lang_final PARAMS ((void)); | |
201 | extern void lang_process PARAMS ((void)); | |
202 | extern void lang_section_start PARAMS ((const char *, union etree_union *)); | |
203 | --- binutils-2.13.90.0.16/ld/ldlang.c.jj 2002-11-14 14:06:22.000000000 +0100 | |
204 | +++ binutils-2.13.90.0.16/ld/ldlang.c 2002-11-22 22:41:51.000000000 +0100 | |
205 | @@ -71,6 +71,10 @@ static void lang_for_each_statement_work | |
206 | static lang_input_statement_type *new_afile | |
207 | PARAMS ((const char *, lang_input_file_enum_type, const char *, boolean)); | |
208 | static lang_memory_region_type *lang_memory_default PARAMS ((asection *)); | |
209 | +static lang_output_section_statement_type * lang_output_section_find_1 | |
210 | + PARAMS ((const char *, int)); | |
211 | +static lang_output_section_statement_type * | |
212 | + lang_output_section_statement_lookup_1 PARAMS ((const char *, int)); | |
213 | static void lang_map_flags PARAMS ((flagword)); | |
214 | static void init_os PARAMS ((lang_output_section_statement_type *)); | |
215 | static void exp_init_os PARAMS ((etree_type *)); | |
216 | @@ -86,6 +90,9 @@ static lang_statement_union_type *wild_s | |
217 | static void output_section_callback | |
218 | PARAMS ((lang_wild_statement_type *, struct wildcard_list *, asection *, | |
219 | lang_input_statement_type *, PTR)); | |
220 | +static void check_section_callback | |
221 | + PARAMS ((lang_wild_statement_type *, struct wildcard_list *, asection *, | |
222 | + lang_input_statement_type *, PTR)); | |
223 | static lang_input_statement_type *lookup_name PARAMS ((const char *)); | |
224 | static boolean load_symbols | |
225 | PARAMS ((lang_input_statement_type *, lang_statement_list_type *)); | |
226 | @@ -98,6 +105,9 @@ static void open_input_bfds PARAMS ((lan | |
227 | static void lang_reasonable_defaults PARAMS ((void)); | |
228 | static void insert_undefined PARAMS ((const char *)); | |
229 | static void lang_place_undefineds PARAMS ((void)); | |
230 | +static void check_input_sections | |
231 | + PARAMS ((lang_statement_union_type *, | |
232 | + lang_output_section_statement_type *)); | |
233 | static void map_input_to_output_sections | |
234 | PARAMS ((lang_statement_union_type *, const char *, | |
235 | lang_output_section_statement_type *)); | |
236 | @@ -700,9 +710,10 @@ lang_memory_default (section) | |
237 | return lang_memory_region_lookup ("*default*"); | |
238 | } | |
239 | ||
240 | -lang_output_section_statement_type * | |
241 | -lang_output_section_find (name) | |
242 | +static lang_output_section_statement_type * | |
243 | +lang_output_section_find_1 (name, constraint) | |
244 | const char *const name; | |
245 | + int constraint; | |
246 | { | |
247 | lang_statement_union_type *u; | |
248 | lang_output_section_statement_type *lookup; | |
249 | @@ -712,7 +723,9 @@ lang_output_section_find (name) | |
250 | u = lookup->next) | |
251 | { | |
252 | lookup = &u->output_section_statement; | |
253 | - if (strcmp (name, lookup->name) == 0) | |
254 | + if (strcmp (name, lookup->name) == 0 | |
255 | + && lookup->constraint != -1 | |
256 | + && (constraint == 0 || constraint == lookup->constraint)) | |
257 | { | |
258 | return lookup; | |
259 | } | |
260 | @@ -721,12 +734,20 @@ lang_output_section_find (name) | |
261 | } | |
262 | ||
263 | lang_output_section_statement_type * | |
264 | -lang_output_section_statement_lookup (name) | |
265 | +lang_output_section_find (name) | |
266 | + const char *const name; | |
267 | +{ | |
268 | + return lang_output_section_find_1 (name, 0); | |
269 | +} | |
270 | + | |
271 | +static lang_output_section_statement_type * | |
272 | +lang_output_section_statement_lookup_1 (name, constraint) | |
273 | const char *const name; | |
274 | + int constraint; | |
275 | { | |
276 | lang_output_section_statement_type *lookup; | |
277 | ||
278 | - lookup = lang_output_section_find (name); | |
279 | + lookup = lang_output_section_find_1 (name, constraint); | |
280 | if (lookup == (lang_output_section_statement_type *) NULL) | |
281 | { | |
282 | ||
283 | @@ -741,6 +762,7 @@ lang_output_section_statement_lookup (na | |
284 | lookup->next = (lang_statement_union_type *) NULL; | |
285 | lookup->bfd_section = (asection *) NULL; | |
286 | lookup->processed = false; | |
287 | + lookup->constraint = constraint; | |
288 | lookup->sectype = normal_section; | |
289 | lookup->addr_tree = (etree_type *) NULL; | |
290 | lang_list_init (&lookup->children); | |
291 | @@ -760,6 +782,13 @@ lang_output_section_statement_lookup (na | |
292 | return lookup; | |
293 | } | |
294 | ||
295 | +lang_output_section_statement_type * | |
296 | +lang_output_section_statement_lookup (name) | |
297 | + const char *const name; | |
298 | +{ | |
299 | + return lang_output_section_statement_lookup_1 (name, 0); | |
300 | +} | |
301 | + | |
302 | static void | |
303 | lang_map_flags (flag) | |
304 | flagword flag; | |
305 | @@ -1434,6 +1463,31 @@ output_section_callback (ptr, sec, secti | |
306 | } | |
307 | } | |
308 | ||
309 | +/* Check if all sections in a wild statement for a particular FILE | |
310 | + are readonly. */ | |
311 | + | |
312 | +static void | |
313 | +check_section_callback (ptr, sec, section, file, output) | |
314 | + lang_wild_statement_type *ptr ATTRIBUTE_UNUSED; | |
315 | + struct wildcard_list *sec ATTRIBUTE_UNUSED; | |
316 | + asection *section; | |
317 | + lang_input_statement_type *file ATTRIBUTE_UNUSED; | |
318 | + PTR output; | |
319 | +{ | |
320 | + /* Exclude sections that match UNIQUE_SECTION_LIST. */ | |
321 | + if (unique_section_p (bfd_get_section_name (file->the_bfd, section))) | |
322 | + return; | |
323 | + | |
324 | + if (section->output_section == NULL) | |
325 | + { | |
326 | + flagword flags = bfd_get_section_flags (section->owner, section); | |
327 | + | |
328 | + if ((flags & SEC_READONLY) == 0) | |
329 | + ((lang_output_section_statement_type *) output)->all_input_readonly | |
330 | + = false; | |
331 | + } | |
332 | +} | |
333 | + | |
334 | /* This is passed a file name which must have been seen already and | |
335 | added to the statement tree. We will see if it has been opened | |
336 | already and had its symbols read. If not then we'll read it. */ | |
337 | @@ -2099,6 +2153,41 @@ lang_place_undefineds () | |
338 | } | |
339 | } | |
340 | ||
341 | +/* Check for all readonly or some readwrite sections. */ | |
342 | + | |
343 | +static void | |
344 | +check_input_sections (s, output_section_statement) | |
345 | + lang_statement_union_type *s; | |
346 | + lang_output_section_statement_type *output_section_statement; | |
347 | +{ | |
348 | + for (; s != (lang_statement_union_type *) NULL; s = s->header.next) | |
349 | + { | |
350 | + switch (s->header.type) | |
351 | + { | |
352 | + case lang_wild_statement_enum: | |
353 | + walk_wild (&s->wild_statement, check_section_callback, | |
354 | + output_section_statement); | |
355 | + if (! output_section_statement->all_input_readonly) | |
356 | + return; | |
357 | + break; | |
358 | + case lang_constructors_statement_enum: | |
359 | + check_input_sections (constructor_list.head, | |
360 | + output_section_statement); | |
361 | + if (! output_section_statement->all_input_readonly) | |
362 | + return; | |
363 | + break; | |
364 | + case lang_group_statement_enum: | |
365 | + check_input_sections (s->group_statement.children.head, | |
366 | + output_section_statement); | |
367 | + if (! output_section_statement->all_input_readonly) | |
368 | + return; | |
369 | + break; | |
370 | + default: | |
371 | + break; | |
372 | + } | |
373 | + } | |
374 | +} | |
375 | + | |
376 | /* Open input files and attatch to output sections. */ | |
377 | ||
378 | static void | |
379 | @@ -2120,6 +2209,23 @@ map_input_to_output_sections (s, target, | |
380 | output_section_statement); | |
381 | break; | |
382 | case lang_output_section_statement_enum: | |
383 | + if (s->output_section_statement.constraint) | |
384 | + { | |
385 | + if (s->output_section_statement.constraint == -1) | |
386 | + break; | |
387 | + s->output_section_statement.all_input_readonly = true; | |
388 | + check_input_sections (s->output_section_statement.children.head, | |
389 | + &s->output_section_statement); | |
390 | + if ((s->output_section_statement.all_input_readonly | |
391 | + && s->output_section_statement.constraint == ONLY_IF_RW) | |
392 | + || (!s->output_section_statement.all_input_readonly | |
393 | + && s->output_section_statement.constraint == ONLY_IF_RO)) | |
394 | + { | |
395 | + s->output_section_statement.constraint = -1; | |
396 | + break; | |
397 | + } | |
398 | + } | |
399 | + | |
400 | map_input_to_output_sections (s->output_section_statement.children.head, | |
401 | target, | |
402 | &s->output_section_statement); | |
403 | @@ -2190,6 +2296,8 @@ strip_excluded_output_sections () | |
404 | asection *s; | |
405 | ||
406 | os = &u->output_section_statement; | |
407 | + if (os->constraint == -1) | |
408 | + continue; | |
409 | s = os->bfd_section; | |
410 | if (s != NULL && (s->flags & SEC_EXCLUDE) != 0) | |
411 | { | |
412 | @@ -4056,7 +4164,7 @@ topower (x) | |
413 | lang_output_section_statement_type * | |
414 | lang_enter_output_section_statement (output_section_statement_name, | |
415 | address_exp, sectype, block_value, | |
416 | - align, subalign, ebase) | |
417 | + align, subalign, ebase, constraint) | |
418 | const char *output_section_statement_name; | |
419 | etree_type *address_exp; | |
420 | enum section_type sectype; | |
421 | @@ -4064,12 +4172,14 @@ lang_enter_output_section_statement (out | |
422 | etree_type *align; | |
423 | etree_type *subalign; | |
424 | etree_type *ebase; | |
425 | + int constraint; | |
426 | { | |
427 | lang_output_section_statement_type *os; | |
428 | ||
429 | current_section = | |
430 | os = | |
431 | - lang_output_section_statement_lookup (output_section_statement_name); | |
432 | + lang_output_section_statement_lookup_1 (output_section_statement_name, | |
433 | + constraint); | |
434 | ||
435 | /* Add this statement to tree. */ | |
436 | #if 0 | |
437 | @@ -4784,6 +4894,8 @@ lang_record_phdrs () | |
438 | struct lang_output_section_phdr_list *pl; | |
439 | ||
440 | os = &u->output_section_statement; | |
441 | + if (os->constraint == -1) | |
442 | + continue; | |
443 | ||
444 | pl = os->phdrs; | |
445 | if (pl != NULL) | |
446 | @@ -4844,7 +4956,8 @@ lang_record_phdrs () | |
447 | { | |
448 | struct lang_output_section_phdr_list *pl; | |
449 | ||
450 | - if (u->output_section_statement.bfd_section == NULL) | |
451 | + if (u->output_section_statement.constraint == -1 | |
452 | + || u->output_section_statement.bfd_section == NULL) | |
453 | continue; | |
454 | ||
455 | for (pl = u->output_section_statement.phdrs; | |
456 | @@ -4914,7 +5027,7 @@ lang_enter_overlay_section (name) | |
457 | etree_type *size; | |
458 | ||
459 | lang_enter_output_section_statement (name, overlay_vma, normal_section, | |
460 | - 0, 0, 0, 0); | |
461 | + 0, 0, 0, 0, 0); | |
462 | ||
463 | /* If this is the first section, then base the VMA of future | |
464 | sections on this one. This will work correctly even if `.' is | |
465 | --- binutils-2.13.90.0.16/ld/ldlex.l.jj 2002-10-31 19:10:42.000000000 +0100 | |
466 | +++ binutils-2.13.90.0.16/ld/ldlex.l 2002-11-22 17:29:14.000000000 +0100 | |
467 | @@ -303,6 +303,8 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^]([*? | |
468 | <EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);} | |
469 | <EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);} | |
470 | <EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);} | |
471 | +<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); } | |
472 | +<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); } | |
473 | <BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);} | |
474 | <BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);} | |
475 | <BOTH,SCRIPT>"l" { RTOKEN( LENGTH);} |