Subversion Repositories tendra.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 7u83 1
/*
2
    		 Crown Copyright (c) 1997
3
 
4
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
12
 
13
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
15
 
16
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
19
 
20
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
22
        these conditions;
23
 
24
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
27
        it may be put.
28
*/
29
 
30
 
31
/* 80x86/translate.c */
32
 
33
/**********************************************************************
34
$Author: release $
35
$Date: 1998/03/16 11:25:21 $
36
$Revision: 1.2 $
37
$Log: translate.c,v $
38
 * Revision 1.2  1998/03/16  11:25:21  release
39
 * Modifications prior to version 4.1.2.
40
 *
41
 * Revision 1.1.1.1  1998/01/17  15:55:52  release
42
 * First version to be checked into rolling release.
43
 *
44
 * Revision 1.25  1997/12/04  20:01:21  pwe
45
 * ANDF-DE V1.9
46
 *
47
 * Revision 1.24  1997/10/10  18:25:36  pwe
48
 * prep ANDF-DE revision
49
 *
50
 * Revision 1.23  1997/08/23  13:45:50  pwe
51
 * initial ANDF-DE
52
 *
53
 * Revision 1.22  1997/03/20  16:24:13  pwe
54
 * dwarf2
55
 *
56
 * Revision 1.21  1997/02/18  11:43:11  pwe
57
 * NEWDIAGS for debugging optimised code
58
 *
59
 * Revision 1.20  1996/08/01  11:11:16  pwe
60
 * PIC id_dec v checkext
61
 *
62
 * Revision 1.19  1996/04/19  16:14:08  pwe
63
 * simplified use of global id = id, correcting linux call problem
64
 *
65
 * Revision 1.18  1996/02/20  14:45:15  pwe
66
 * linux/elf return struct
67
 *
68
 * Revision 1.17  1996/02/01  09:34:42  pwe
69
 * PIC oddities for AVS
70
 *
71
 * Revision 1.16  1996/01/05  16:25:37  pwe
72
 * env_size and env_offset within constant expressions
73
 *
74
 * Revision 1.15  1995/12/19  13:34:22  pwe
75
 * PIC global idents, and static vars
76
 *
77
 * Revision 1.14  1995/12/01  16:25:37  pwe
78
 * correct directive re solaris proc equality
79
 *
80
 * Revision 1.13  1995/12/01  11:53:42  pwe
81
 * solaris proc equality
82
 *
83
 * Revision 1.12  1995/10/23  17:34:28  pwe
84
 * dynamic initialisation PIC, and sco diags
85
 *
86
 * Revision 1.11  1995/10/20  14:11:25  pwe
87
 * PIC globals
88
 *
89
 * Revision 1.10  1995/10/09  15:14:12  pwe
90
 * dynamic initialisation etc
91
 *
92
 * Revision 1.9  1995/09/20  12:00:27  pwe
93
 * svr4 and solaris initial_value, and solaris 64 bit correction
94
 *
95
 * Revision 1.8  1995/08/04  08:29:47  pwe
96
 * 4.0 general procs implemented
97
 *
98
 * Revision 1.7  1995/03/24  09:21:41  pwe
99
 * global proc renaming avoided for SCO
100
 *
101
 * Revision 1.6  1995/03/20  18:54:33  pwe
102
 * stabs initialisation
103
 *
104
 * Revision 1.5  1995/03/17  18:29:39  pwe
105
 * stabs diagnostics for solaris and linux
106
 *
107
 * Revision 1.4  1995/02/20  14:08:53  pwe
108
 * correct Global tag identity
109
 *
110
 * Revision 1.3  1995/02/08  13:01:21  pwe
111
 * Global tag identity - may need more?
112
 *
113
 * Revision 1.2  1995/01/30  12:56:57  pwe
114
 * Ownership -> PWE, tidy banners
115
 *
116
 * Revision 1.1  1994/10/27  14:15:22  jmf
117
 * Initial revision
118
 *
119
 * Revision 1.1  1994/07/12  14:43:00  jmf
120
 * Initial revision
121
 *
122
**********************************************************************/
123
 
124
 
125
 
126
#include "config.h"
127
#include "common_types.h"
128
#include "installglob.h"
129
#include "tags.h"
130
#include "exp.h"
131
#include "expmacs.h"
132
#include "optimise.h"
133
#include "flags.h"
134
#include "coder.h"
135
#include "shapemacs.h"
136
#include "instr.h"
137
#include "out.h"
138
#include "scan2.h"
139
#include "weights.h"
140
#include "instr386.h"
141
#include "operand.h"
142
#include "machine.h"
143
#include "codermacs.h"
144
#include "flpt.h"
145
#include "flpttypes.h"
146
#include "localflags.h"
147
#include "localtypes.h"
148
#include "diag_fns.h"
149
#include "assembler.h"
150
#include "cproc.h"
151
#include "evaluate.h"
152
#include "externs.h"
153
#include "readglob.h"
154
#include "tv_callees.h"
155
#include "basicread.h"
156
#ifdef NEWDWARF
157
#include "dw2_iface.h"
158
#include "dw2_config.h"
159
#endif
160
 
161
 
162
#define ptg(x) ((x)->ptf.glob)		/* addition to expmacs */
163
 
164
 
165
static exp delayed_const_list = nilexp;
166
 
167
static int const_ready
168
    PROTO_N ( (e) )
169
    PROTO_T ( exp e )
170
{
171
  unsigned char  n = name (e);
172
  if (n == env_size_tag)
173
    return (brog(son(son(e))) -> dec_u.dec_val.processed);
174
  if (n == env_offset_tag)
175
    return (name(son(e)) == 0);
176
  if (n == name_tag || son(e) == nilexp)
177
    return 1;
178
  e = son(e);
179
  while (!last(e)) {
180
    if (!const_ready(e))
181
      return 0;
182
    e = bro(e);
183
  }
184
  return (const_ready(e));
185
}
186
 
187
static void eval_if_ready
188
    PROTO_N ( (t,now) )
189
    PROTO_T ( exp t X int now )
190
{
191
  if (now || const_ready(son(t))) {
192
    if (isglob(t)) {
193
	dec * d = ptg(t);
194
	if (!writable_strings &&
195
	    (!isvar (t) || (d -> dec_u.dec_val.acc & f_constant)) &&
196
	    !PIC_code) {
197
          out_readonly_section();
198
	  outnl ();
199
#ifdef NEWDWARF
200
	  if (dwarf2)
201
	    note_ro (d -> dec_u.dec_val.dec_id);
202
#endif
203
	}
204
	else {
205
	  if (do_prom)
206
	    failer ("prom data");
207
	  outs (".data");
208
	  outnl ();
209
#ifdef NEWDWARF
210
	  if (dwarf2)
211
	    note_data (d -> dec_u.dec_val.dec_id);
212
#endif
213
	};
214
	evaluate (son(t),
215
                  (-1),
216
                  d -> dec_u.dec_val.dec_id,
217
		  (!isvar (t)),
218
                  (int)(d -> dec_u.dec_val.extnamed),
219
                  d -> dec_u.dec_val.diag_info);
220
    }
221
    else {
222
	if (!writable_strings && name (son (t)) != res_tag) {
223
             out_readonly_section();
224
	     outnl ();
225
	   }
226
	else {
227
	     if (do_prom)
228
	       failer ("prom data");
229
	     outs (".data");
230
	     outnl ();
231
	   };
232
	evaluate (son (t), no (t), (char *) 0,
233
	        (name (son (t)) != res_tag), 0, (diag_global*)0);
234
    }
235
    retcell (t);
236
  }
237
  else {
238
    bro(t) = delayed_const_list;
239
    delayed_const_list = t;
240
  }
241
  return;
242
}
243
 
244
 
245
/* PROCEDURES */
246
 
247
void make_code
248
    PROTO_N ( (my_def) )
249
    PROTO_T ( dec * my_def )
250
{
251
  exp tg = my_def -> dec_u.dec_val.dec_exp;
252
  char *id = my_def -> dec_u.dec_val.dec_id;
253
 
254
  if (son(tg) != nilexp && shape_size(sh(son(tg))) == 0 && name(son(tg)) == asm_tag) {
255
    ash stack;
256
    stack.ashsize = stack.ashalign = 0;
257
    if (props(son(tg)) != 0)
258
      failer ("~asm not in ~asm_sequence");
259
    check_asm_seq (son(son(tg)), 1);
260
    outs (".text");
261
    coder (zero, stack, son(tg));
262
    outnl ();
263
  }
264
 
265
  if (son (tg) != nilexp && (my_def -> dec_u.dec_val.extnamed || no(tg) != 0)) {
266
    if (name (son (tg)) == proc_tag || name (son (tg)) == general_proc_tag) {
267
      if (strncmp("__I.TDF", id+prefix_length, 7)==0) {
268
	out_initialiser (id);
269
	set_proc_uses_external (son (tg));	/* for PIC_code, should be done in install_fns? */
270
      }
271
      outs (".text");
272
      outnl ();
273
      if (isvar(tg)) {
274
        char * newid = make_local_name();
275
	if (my_def -> dec_u.dec_val.extnamed) {
276
	  my_def -> dec_u.dec_val.extnamed = 0;
277
	  outs(".globl ");
278
	  outs(id);
279
	  outnl();
280
	}
281
	dot_align(4);
282
        outs(id);
283
	outs(":");
284
	outnl();
285
	outlong();
286
	outs(newid);
287
	outnl();
288
	id = newid;
289
	my_def -> dec_u.dec_val.extnamed = 0;
290
      }
291
      my_def -> dec_u.dec_val.index =	/* for use in constant evaluation */
292
	cproc (son (tg), id, (-1), (int)(my_def -> dec_u.dec_val.extnamed),
293
                my_def -> dec_u.dec_val.diag_info);
294
      while (const_list != nilexp) {
295
	/* put in the constants required by the procedure */
296
	exp t = const_list;
297
	const_list = bro (const_list);
298
	eval_if_ready(t,0);
299
      };
300
    }
301
    else {			/* global values */
302
     diag_global * diag_props = my_def -> dec_u.dec_val.diag_info;
303
 
304
      if (shape_size(sh(son(tg))) == 0) {;
305
	if (my_def -> dec_u.dec_val.extnamed) {
306
	  outs(".globl ");
307
	  outs(id);
308
	  outnl();
309
	}
310
	else
311
	if (issol86) {
312
	  outs(".local ");
313
	  outs(id);
314
	  outnl();
315
	}
316
#if islinux || isfreebsd
317
	outs(".data");
318
	outnl();
319
	outs(id);
320
	outs(":");
321
	outnl();
322
#else
323
	outs(".set ");
324
	outs(id);
325
	outs(",");
326
	outn((long)0);
327
	outnl();
328
#endif
329
      }
330
      else
331
      if (!PIC_code && !isvar(tg) && name(son(tg)) == null_tag &&
332
	  name(sh(son(tg))) == prokhd) {
333
	if (my_def -> dec_u.dec_val.extnamed) {
334
	  outs(".globl ");
335
	  outs(id);
336
	  outnl();
337
	}
338
	else
339
	if (issol86) {
340
	  outs(".local ");
341
	  outs(id);
342
	  outnl();
343
	}
344
	outs(".set ");
345
	outs(id);
346
	outs(",");
347
	outn((long)no(son(tg)));
348
	outnl();
349
      }
350
      else {
351
      if (!my_def -> dec_u.dec_val.isweak &&
352
          is_comm(son(tg)))
353
       {
354
	 int is_ext = (my_def -> dec_u.dec_val.extnamed);
355
         if (diag_props)
356
#ifdef NEWDWARF
357
           DIAG_VAL_BEGIN (diag_props, is_ext, -1, id);
358
#else
359
           diag_val_begin(diag_props, is_ext, -1, id);
360
#endif
361
	 if (name(son(tg)) == clear_tag && no(son(tg)) == -1) {
362
				/* prom global data */
363
	   if (is_ext) {
364
	     outs(".globl ");
365
	     outs(id);
366
	     outnl();
367
	   }
368
           out_bss(id, sh(son(tg)));
369
#ifdef NEWDWARF
370
	   if (dwarf2)
371
	     note_data (id);
372
#endif
373
	 }
374
	 else
375
	 if (is_ext)
376
           out_dot_comm(id, sh(son(tg)));
377
	 else
378
           out_dot_lcomm(id, sh(son(tg)));
379
         if (diag_props) {
380
#ifdef NEWDWARF
381
           DIAG_VAL_END (diag_props);
382
#else
383
           diag_val_end(diag_props);
384
#endif
385
	 }
386
       }
387
 
388
      else {			/* global values */
389
 
390
	exp t = getexp (f_bottom, nilexp, 0, son(tg), nilexp, props(tg), -1, 0);
391
	ptg(t) = my_def;
392
	eval_if_ready (t, 0);
393
 
394
      };
395
     };
396
    };
397
  };
398
 
399
  if (son(tg) != nilexp)  {
400
     my_def -> dec_u.dec_val.processed = 1;
401
  };
402
  return;
403
}
404
 
405
void mark_unaliased
406
    PROTO_N ( (e) )
407
    PROTO_T ( exp e )
408
{
409
  exp p = pt (e);
410
  int ca = 1;
411
  while (p != nilexp && ca) {
412
#ifdef NEWDIAGS
413
    if ((bro(p) == nilexp ||
414
#else
415
    if (bro(p) == nilexp ||
416
#endif
417
        (!(last (p) && name (bro (p)) == cont_tag) &&
418
	 !(!last (p) && last (bro (p)) &&
419
                 name (bro (bro (p))) == ass_tag)))
420
#ifdef NEWDIAGS
421
	&& !isdiaginfo(p))
422
#endif
423
      ca = 0;
424
    p = pt (p);
425
  };
426
  if (ca)
427
    setcaonly (e);
428
  return;
429
}
430
 
431
 
432
void translate_capsule
433
    PROTO_Z ()
434
{
435
  dec * my_def;
436
 
437
#ifdef STABS
438
#ifdef NEWDWARF
439
  if (diagnose && !dwarf2)
440
#else
441
  if (diagnose)
442
#endif
443
    init_stab_aux ();
444
#endif
445
 
446
 
447
  my_def = top_def;
448
  while (my_def != (dec *) 0) {
449
    exp crt_exp = my_def -> dec_u.dec_val.dec_exp;
450
    if (PIC_code) {
451
      exp idval = son(crt_exp);
452
      if (!(my_def -> dec_u.dec_val.dec_var) &&
453
	   ( idval == nilexp || ( name(idval) != val_tag && name(idval) != real_tag &&
454
		name(idval) != null_tag )	/* optimised out in opt_all_exps/checkext */
455
	   ) &&
456
	   (name(sh(crt_exp)) != prokhd ||
457
		( idval != nilexp && name(idval) != null_tag &&
458
		  name(idval) != proc_tag && name(idval) != general_proc_tag )
459
	   ) )
460
      {
461
		/* make variable, and change all uses to contents */
462
	exp p = pt(crt_exp);
463
	if (my_def -> dec_u.dec_val.extnamed)
464
	  sh(crt_exp) = f_pointer(f_alignment(sh(crt_exp)));
465
	else
466
	  setvar(crt_exp);
467
	while (p != nilexp) {
468
	  exp np = pt(p);
469
	  exp* ptr = refto (father(p), p);
470
	  exp c = getexp (sh(p), bro(p), last(p), p, nilexp, 0, 0, cont_tag);
471
	  setfather (c, p);
472
	  if (no(p) != 0) {
473
	    exp r = getexp (sh(p), c, 1, p, nilexp, 0, no(p), reff_tag);
474
	    no(p) = 0;
475
	    son(c) = r;
476
	    setfather (r, p);
477
	  }
478
	  *ptr = c;
479
	  p = np;
480
	}
481
      }
482
    }
483
    else {	/* !PIC_code; make indirect global idents direct */
484
      exp tg = crt_exp;
485
      while (!isvar(tg) && son(tg) != nilexp && name(son(tg)) == name_tag && no(son(tg)) == 0)
486
	tg = son(son(tg));
487
      if (tg != crt_exp) {
488
	exp p = pt(crt_exp);
489
	while (p != nilexp) {
490
	  exp np = pt(p);
491
	  if (son(p) != crt_exp)
492
	    failer ("not simple name");
493
	  son(p) = tg;
494
	  pt(p) = pt(tg);
495
	  pt(tg) = p;
496
	  ++no(tg);
497
	  p = np;
498
	}
499
	pt(crt_exp) = nilexp;
500
	no(crt_exp) = 0;
501
      }
502
    };
503
    my_def = my_def -> def_next;
504
  }
505
 
506
  opt_all_exps ();
507
 
508
  transform_var_callees ();
509
 
510
      /* mark static unaliased */
511
    my_def = top_def;
512
    while (my_def != (dec *) 0) {
513
      exp crt_exp = my_def -> dec_u.dec_val.dec_exp;
514
      if (son (crt_exp) != nilexp &&
515
	  !my_def -> dec_u.dec_val.extnamed &&
516
   	  isvar (crt_exp))
517
        mark_unaliased (crt_exp);
518
      my_def = my_def -> def_next;
519
    };
520
 
521
  /* compile procedures, evaluate constants, put in the .comm entries for
522
     undefined objects */
523
 
524
#ifdef NEWDWARF
525
  if (dwarf2) {
526
    outs (".text\n");
527
    dwarf2_prelude ();
528
  }
529
#endif
530
 
531
  my_def = top_def;
532
 
533
  while (my_def != (dec *) 0) {
534
    if (!my_def -> dec_u.dec_val.processed)
535
       make_code (my_def);
536
    my_def = my_def -> def_next;
537
  };
538
 
539
  while (delayed_const_list != nilexp) {
540
    exp t = delayed_const_list;
541
    delayed_const_list = bro (delayed_const_list);
542
    eval_if_ready(t,1);
543
  }
544
 
545
  outs (".text\n");
546
#ifdef NEWDWARF
547
  if (dwarf2) {
548
    dwarf2_postlude ();
549
  }
550
#endif
551
  return;
552
 
553
}
554
 
555
void translate_tagdef
556
    PROTO_Z ()
557
{
558
  return;
559
}
560
 
561
void translate_unit
562
    PROTO_Z ()
563
{
564
  return;
565
}
566