00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifdef _KEEP_RCS_ID
00052 #endif
00053
00054 #include "whirl2c_common.h"
00055 #include "PUinfo.h"
00056 #include "ty2c.h"
00057 #include "tcon2c.h"
00058 #include "unparse_target.h"
00059
00060 #if defined(__GNUC__) && (__GNUC__ == 3)
00061 # define USING_HASH_SET 1
00062 # include <ext/hash_set>
00063 using namespace __gnu_cxx;
00064 #elif defined(__sgi) && !defined(__GNUC__)
00065 # define USING_HASH_SET 1
00066 # include <hash_set>
00067 #else
00068 # include <set>
00069 #endif
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 typedef struct SCALAR_C_NAME
00082 {
00083 const char *real_name;
00084 const char *pseudo_name;
00085 } SCALAR_C_NAME;
00086
00087
00088
00089
00090
00091
00092 const char TY2C_Aligned_Block_Name[] = "__block";
00093
00094 #define MTYPE_PREDEF MTYPE_F16
00095
00096 static char Name_Unknown_Type[] = "__UNKNOWN_TYPE";
00097 static const SCALAR_C_NAME Scalar_C_Names[MTYPE_PREDEF+1] =
00098 {{"void", Name_Unknown_Type},
00099 {"char", "_BOOLEAN"},
00100 {"signed char", "_INT8"},
00101 {"signed short", "_INT16"},
00102 {"signed int", "_INT32"},
00103 {"signed long long", "_INT64"},
00104 {"unsigned char", "_UINT8"},
00105 {"unsigned short", "_UINT16"},
00106 {"unsigned int", "_UINT32"},
00107 {"unsigned long long", "_UINT64"},
00108 {"float", "_IEEE32"},
00109 {"double", "_IEEE64"},
00110 {Name_Unknown_Type, "_IEEE80"},
00111 {Name_Unknown_Type, "_IEEE128"}
00112 };
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 const char Special_Void_TypeName[] = "void";
00123 const char Special_String_TypeName[] = "_STRING";
00124 const char Special_Quad_TypeName[] = "_QUAD";
00125 const char Special_Complex32_TypeName[] = "_COMPLEX32";
00126 const char Special_Complex64_TypeName[] = "_COMPLEX64";
00127 const char Special_ComplexQD_TypeName[] = "_COMPLEXQD";
00128
00129 #define GET_SPECIAL_TYPENAME(mtype)\
00130 ((mtype) == MTYPE_V? Special_Void_TypeName : \
00131 ((mtype) == MTYPE_STR? Special_String_TypeName : \
00132 ((mtype) == MTYPE_FQ? Special_Quad_TypeName : \
00133 ((mtype) == MTYPE_C4? Special_Complex32_TypeName : \
00134 ((mtype) == MTYPE_C8? Special_Complex64_TypeName : \
00135 ((mtype) == MTYPE_CQ? Special_ComplexQD_TypeName : \
00136 (const char *)NULL))))))
00137
00138 #define PTR_OR_ALIGNED_WITH_STRUCT(fld_ty, struct_align) \
00139 (TY_Is_Pointer(fld_ty) || TY_align(fld_ty) <= struct_align)
00140
00141
00142 static void TY2C_scalar(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context);
00143 static void TY2C_array(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context);
00144 static void TY2C_struct(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context);
00145 static void TY2C_function(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context);
00146 static void TY2C_pointer(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context);
00147 static void TY2C_void(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context);
00148 static void TY2C_invalid(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context);
00149
00150
00151
00152
00153
00154
00155
00156 typedef void (*TY2C_HANDLER_FUNC)(TOKEN_BUFFER, TY_IDX, CONTEXT);
00157
00158 static const TY2C_HANDLER_FUNC
00159 TY2C_Handle[KIND_LAST] =
00160 {
00161 &TY2C_invalid,
00162 &TY2C_scalar,
00163 &TY2C_array,
00164 &TY2C_struct,
00165 &TY2C_pointer,
00166 &TY2C_function,
00167 &TY2C_void,
00168 };
00169
00170
00171
00172
00173
00174
00175
00176
00177 const char *TY2C_Complex_Realpart_Name = "realpart";
00178 const char *TY2C_Complex_Imagpart_Name = "imagpart";
00179 extern int compiling_upc_flag ;
00180
00181
00182
00183
00184 static void
00185 Write_Scalar_Typedef(FILE *ofile,
00186 const char *real_type,
00187 const char *new_name)
00188 {
00189 TOKEN_BUFFER tdef = New_Token_Buffer();
00190
00191 Append_Token_String(tdef, "typedef");
00192 Append_Token_String(tdef, real_type);
00193 Append_Token_String(tdef, new_name);
00194 Append_Token_Special(tdef, ';');
00195 Append_Indented_Newline(tdef, 1);
00196 Write_And_Reclaim_Tokens(ofile, NULL, &tdef);
00197 }
00198
00199
00200 static void
00201 Write_Typedef(FILE *ofile,
00202 TY_IDX ty,
00203 const char *type_name)
00204 {
00205 TOKEN_BUFFER tdef = New_Token_Buffer();
00206 CONTEXT context;
00207
00208 CONTEXT_reset(context);
00209
00210 Append_Token_String(tdef, type_name);
00211 TY2C_Handle[(TY_KIND)TY_kind(ty)](tdef, ty, context);
00212 Prepend_Token_String(tdef, "typedef");
00213 Append_Token_Special(tdef, ';');
00214 Append_Indented_Newline(tdef, 1);
00215
00216
00217 Prepend_Indented_Newline(tdef, 1);
00218 Write_And_Reclaim_Tokens(ofile, NULL, &tdef);
00219 }
00220
00221
00222 static void
00223 TY2C_prepend_qualifiers(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00224 {
00225 if (!CONTEXT_unqualified_ty2c(context))
00226 {
00227 if (TY_is_const(ty))
00228 Prepend_Token_String(decl_tokens, "const");
00229 if (TY_is_volatile(ty))
00230 Prepend_Token_String(decl_tokens, "volatile");
00231 if (TY_is_restrict(ty))
00232 Prepend_Token_String(decl_tokens, "restrict");
00233 }
00234 }
00235
00236
00237 static INT64
00238 get_field_gap(FLD_HANDLE this_fld, FLD_HANDLE next_fld, INT64 max_size,
00239 BOOL is_union)
00240 {
00241
00242
00243
00244
00245
00246
00247 INT64 field_gap = TY_size(FLD_type(this_fld));
00248
00249 if (!is_union &&
00250 !next_fld.Is_Null() &&
00251 field_gap != FLD_ofst(next_fld)-FLD_ofst(this_fld))
00252 {
00253 field_gap = FLD_ofst(next_fld) - FLD_ofst(this_fld);
00254 }
00255 if (field_gap > max_size || (!is_union && next_fld.Is_Null ()))
00256 {
00257 field_gap = max_size;
00258 }
00259 return field_gap;
00260 }
00261
00262
00263 static FLD_HANDLE
00264 skip_till_next_field(FLD_HANDLE this_fld,
00265 const INT64 struct_align,
00266 const INT64 struct_size,
00267 BOOL is_union)
00268 {
00269
00270
00271
00272
00273
00274
00275
00276 FLD_HANDLE next_fld = FLD_next(this_fld);
00277
00278 if (!is_union)
00279 {
00280
00281
00282
00283
00284
00285 while (!next_fld.Is_Null () &&
00286 (FLD_ofst(this_fld) >= FLD_ofst(next_fld) ||
00287 !PTR_OR_ALIGNED_WITH_STRUCT(FLD_type(next_fld), struct_align) ||
00288 (!TY_Is_Pointer(FLD_type(next_fld)) &&
00289 FLD_ofst(next_fld) % TY_align(FLD_type(next_fld)) != 0) ||
00290 (!is_union &&
00291 FLD_Is_Bitfield(next_fld,
00292 FLD_next(next_fld),
00293 struct_size - FLD_ofst(next_fld)))))
00294 {
00295 next_fld = FLD_next(next_fld);
00296 }
00297 }
00298 return next_fld;
00299 }
00300
00301
00302 static void
00303 TY2C_prepend_filler_field(TOKEN_BUFFER decl_tokens, INT64 byte_size)
00304 {
00305
00306
00307 TOKEN_BUFFER field_tokens;
00308
00309 field_tokens = New_Token_Buffer();
00310 Append_Token_String(field_tokens,
00311 Scalar_C_Names[MTYPE_U1].pseudo_name);
00312 Append_Token_String(field_tokens, W2CF_Symtab_Unique_Name("fill"));
00313 Append_Token_Special(field_tokens, '[');
00314 TCON2C_translate(field_tokens, Host_To_Targ(MTYPE_I8, byte_size));
00315 Append_Token_Special(field_tokens, ']');
00316 Append_Token_Special(field_tokens, ';');
00317 Prepend_Indented_Newline(field_tokens, 1);
00318 Prepend_And_Reclaim_Token_List(decl_tokens, &field_tokens);
00319 }
00320
00321
00322 static void
00323 TY2C_prepend_FLD_list(TOKEN_BUFFER decl_tokens,
00324 FLD_HANDLE fld,
00325 const BOOL is_union,
00326 const INT64 struct_align,
00327 const INT64 struct_size,
00328 CONTEXT context)
00329 {
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340 TOKEN_BUFFER fld_tokens;
00341 INT64 fld_gap;
00342 const INT64 remaining_bytes = struct_size - FLD_ofst(fld);
00343
00344 FLD_HANDLE next_fld = skip_till_next_field(fld,
00345 struct_align,
00346 struct_size,
00347 is_union);
00348 fld_gap = get_field_gap(fld, next_fld, remaining_bytes, is_union);
00349
00350
00351
00352
00353
00354
00355 if (!next_fld.Is_Null ())
00356 {
00357 if (is_union)
00358 TY2C_prepend_FLD_list(decl_tokens,
00359 next_fld,
00360 TRUE,
00361 struct_align,
00362 struct_size,
00363 context);
00364 else
00365 TY2C_prepend_FLD_list(decl_tokens,
00366 next_fld,
00367 FALSE,
00368 struct_align,
00369 struct_size,
00370 context);
00371 }
00372
00373
00374
00375
00376
00377 if (!PTR_OR_ALIGNED_WITH_STRUCT(FLD_type(fld), struct_align) ||
00378 (!is_union &&
00379 FLD_Is_Bitfield(fld, FLD_next(fld), remaining_bytes)))
00380 {
00381
00382 if (fld_gap > 0)
00383 TY2C_prepend_filler_field(decl_tokens, fld_gap);
00384 }
00385 else
00386 {
00387
00388
00389
00390 if (!is_union && fld_gap > TY_size(FLD_type(fld)))
00391 {
00392 TY2C_prepend_filler_field(decl_tokens,
00393 fld_gap - TY_size(FLD_type(fld)));
00394 }
00395
00396
00397 fld_tokens = New_Token_Buffer();
00398 Append_Token_String(fld_tokens, W2CF_Symtab_Nameof_Fld(fld));
00399 TY2C_translate(fld_tokens, FLD_type(fld), context);
00400 Append_Token_Special(fld_tokens, ';');
00401 Prepend_And_Reclaim_Token_List(decl_tokens, &fld_tokens);
00402 Prepend_Indented_Newline(decl_tokens, 1);
00403 }
00404 }
00405
00406
00407 static void
00408 TY2C_Prepend_Alignment_Type(TOKEN_BUFFER tokens, INT64 align)
00409 {
00410 CONTEXT c;
00411
00412 CONTEXT_reset(c);
00413 switch (align)
00414 {
00415 case 1:
00416 TY2C_translate(tokens, Stab_Mtype_To_Ty(MTYPE_U1), c);
00417 break;
00418 case 2:
00419 TY2C_translate(tokens, Stab_Mtype_To_Ty(MTYPE_U2), c);
00420 break;
00421 case 4:
00422 TY2C_translate(tokens, Stab_Mtype_To_Ty(MTYPE_U4), c);
00423 break;
00424 case 8:
00425 TY2C_translate(tokens, Stab_Mtype_To_Ty(MTYPE_U8), c);
00426 break;
00427 case 16:
00428 TY2C_translate(tokens, Stab_Mtype_To_Ty(MTYPE_FQ), c);
00429 break;
00430 default:
00431 Is_True(FALSE,
00432 ("Unexpected alignment (%lld) in TY2C_Prepend_Alignment_Type()",
00433 align));
00434 }
00435 }
00436
00437
00438 static void
00439 TY2C_prototype_params(TOKEN_BUFFER decl_tokens,
00440 TYLIST_IDX params,
00441 CONTEXT context)
00442 {
00443 TOKEN_BUFFER param_tokens;
00444
00445 if (Tylist_Table[params] == 0)
00446 {
00447 Append_Token_String(decl_tokens, "void");
00448 }
00449 else
00450 {
00451 while (Tylist_Table[params] != 0)
00452 {
00453 param_tokens = New_Token_Buffer();
00454 TY2C_translate(param_tokens, TYLIST_item(Tylist_Table[params]),
00455 context);
00456 Append_And_Reclaim_Token_List(decl_tokens, ¶m_tokens);
00457 params = TYLIST_next(params);
00458 if (Tylist_Table[params] != 0)
00459 Append_Token_Special(decl_tokens, ',');
00460 }
00461 }
00462 }
00463
00464
00465
00466
00467
00468 static void
00469 TY2C_scalar(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00470 {
00471 Is_True(TY_Is_String(ty) ||
00472 TY_mtype(ty) <= MTYPE_PREDEF, ("Illegal type in TY2C_scalar()"));
00473 Is_True(TY_mtype(ty) != MTYPE_UNKNOWN, ("Unknown type in TY2C_scalar()"));
00474
00475 if (TY_Is_String(ty))
00476 {
00477 Prepend_Token_String(decl_tokens,
00478 Scalar_C_Names[MTYPE_U1].pseudo_name);
00479 Append_Token_Special(decl_tokens, '[');
00480 Append_Token_Special(decl_tokens, ']');
00481 }
00482 else
00483 {
00484
00485
00486 if (ty == shared_ptr_idx || strcmp(TY_name(ty),"shared_ptr_struct") == 0) {
00487 Prepend_Token_String(decl_tokens, "upcr_shared_ptr_t");
00488 } else if (ty == pshared_ptr_idx || strcmp(TY_name(ty),"pshared_ptr_struct") == 0) {
00489 Prepend_Token_String(decl_tokens, "upcr_pshared_ptr_t");
00490 } else if (Type_Is_Shared_Ptr(ty)) {
00491
00492
00493 Prepend_Token_String(decl_tokens, (TY_To_Sptr_Idx(ty) == pshared_ptr_idx) ? "upcr_pshared_ptr_t" : "upcr_shared_ptr_t");
00494 } else {
00495 Prepend_Token_String(decl_tokens,
00496 Scalar_C_Names[TY_mtype(ty)].pseudo_name);
00497 }
00498 }
00499 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00500 }
00501
00502
00503 static void
00504 TY2C_array(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00505 {
00506 if (Stab_Array_Has_Dynamic_Bounds(ty))
00507 {
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517 if (CONTEXT_incomplete_ty2c(context))
00518 {
00519
00520
00521
00522
00523
00524 Append_Token_Special(decl_tokens, '[');
00525 Append_Token_Special(decl_tokens, ']');
00526
00527
00528
00529
00530 CONTEXT_reset_incomplete_ty2c(context);
00531 }
00532 else
00533 {
00534
00535
00536
00537 Prepend_Token_Special(decl_tokens, '*');
00538 if (TY_Is_Array_Or_Function(TY_AR_etype(ty)))
00539 WHIRL2C_parenthesize(decl_tokens);
00540
00541
00542 CONTEXT_set_incomplete_ty2c(context);
00543 }
00544 }
00545 else
00546 {
00547 INT32 dim;
00548 INT64 num_elts;
00549
00550
00551
00552
00553 for (dim = 0; dim < TY_AR_ndims(ty); dim++)
00554 {
00555 Append_Token_Special(decl_tokens, '[');
00556
00557
00558
00559
00560
00561
00562 num_elts = (TY_AR_ubnd_val(ty, dim) - TY_AR_lbnd_val(ty, dim) + 1);
00563
00564 if (num_elts > 0)
00565 TCON2C_translate(decl_tokens,
00566 Host_To_Targ(MTYPE_I8, num_elts));
00567
00568 Append_Token_Special(decl_tokens, ']');
00569 }
00570
00571
00572
00573
00574 CONTEXT_reset_incomplete_ty2c(context);
00575 }
00576
00577
00578 if (TY_kind(TY_AR_etype(ty)) == KIND_STRUCT) {
00579 CONTEXT_set_incomplete_ty2c(context);
00580 }
00581
00582
00583
00584
00585 TY2C_translate(decl_tokens, TY_AR_etype(ty), context);
00586 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00587 }
00588
00589
00590
00591 static void TY2C_complete_struct(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context) {
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618 CONTEXT fld_context;
00619 BOOL is_equivalenced = Stab_Is_Equivalenced_Struct(ty);
00620
00621 if (!TY_flist(Ty_Table[ty]).Is_Null ()) {
00622 fld_context = context;
00623 CONTEXT_reset_unqualified_ty2c(fld_context);
00624 CONTEXT_reset_incomplete_ty2c(fld_context);
00625
00626 if (is_equivalenced)
00627 {
00628
00629
00630
00631
00632 Prepend_Token_Special(decl_tokens, '}');
00633 Prepend_Indented_Newline(decl_tokens, 1);
00634 Increment_Indentation();
00635 Prepend_Token_Special(decl_tokens, ';');
00636 Prepend_Token_String(decl_tokens, "__align");
00637 TY2C_Prepend_Alignment_Type(decl_tokens, TY_align(ty));
00638 Prepend_Indented_Newline(decl_tokens, 1);
00639 Prepend_Token_Special(decl_tokens, ';');
00640 Prepend_Token_String(decl_tokens, TY2C_Aligned_Block_Name);
00641 }
00642
00643
00644
00645
00646 Prepend_Token_Special(decl_tokens, '}');
00647 Prepend_Indented_Newline(decl_tokens, 1);
00648
00649
00650
00651
00652 Increment_Indentation();
00653 TY2C_prepend_FLD_list(decl_tokens,
00654 TY_flist(Ty_Table[ty]),
00655 TY_is_union(ty),
00656 TY_align(ty),
00657 TY_size(ty),
00658 fld_context);
00659 Decrement_Indentation();
00660
00661
00662 Prepend_Token_Special(decl_tokens, '{');
00663
00664 if (is_equivalenced)
00665 {
00666
00667
00668
00669 Prepend_Token_String(decl_tokens, TY_is_union(ty)? "UNION": "struct");
00670 Prepend_Indented_Newline(decl_tokens, 1);
00671 Decrement_Indentation();
00672 Prepend_Token_Special(decl_tokens, '{');
00673 }
00674 Prepend_Token_String(decl_tokens, W2CF_Symtab_Nameof_Ty(ty));
00675 } else if (TY_size(ty) == 1) {
00676
00677
00678
00679 Prepend_Token_Special(decl_tokens, '}');
00680 Prepend_Indented_Newline(decl_tokens, 1);
00681
00682 Prepend_Token_Special(decl_tokens, ';');
00683 Prepend_Token_String(decl_tokens, W2CF_Symtab_Unique_Name("dummy"));
00684 TY2C_translate(decl_tokens, Stab_Mtype_To_Ty(MTYPE_U1), context);
00685
00686 Increment_Indentation();
00687 Prepend_Indented_Newline(decl_tokens, 1);
00688 Prepend_Token_Special(decl_tokens, '{');
00689 Prepend_Token_String(decl_tokens, W2CF_Symtab_Nameof_Ty(ty));
00690 Decrement_Indentation();
00691 }
00692
00693 if (TY_is_union(ty) || is_equivalenced)
00694 Prepend_Token_String(decl_tokens, "union");
00695 else
00696 Prepend_Token_String(decl_tokens, "struct");
00697 }
00698
00699
00700
00701 struct eqstr {
00702 bool operator()(const char* s1, const char* s2) const
00703 {
00704 return strcmp(s1, s2) == 0;
00705 }
00706 };
00707
00708 static hash_set<const char*, hash<const char*>, eqstr> struct_names;
00709
00710
00711
00712 static void TY2C_Output_Struct_Type(TY_IDX ty,
00713 INT lines_between_decls,
00714 CONTEXT context) {
00715
00716 if (TY_is_translated_to_c(ty) || struct_names.find(TY_name(ty)) != struct_names.end()
00717 || TY_is_written(ty) == 0 ) {
00718
00719 return;
00720 }
00721
00722 if (TY_kind(ty) == KIND_STRUCT && !is_upcr_ptr(ty)) {
00723 struct_names.insert(TY_name(ty));
00724
00725
00726 for (FLD_HANDLE fld = TY_fld(ty); ;fld = FLD_next(fld)) {
00727 TY2C_Output_Struct_Type(FLD_type(fld), lines_between_decls, context);
00728 if (FLD_last_field(fld)) {
00729 break;
00730 }
00731 }
00732
00733 TOKEN_BUFFER tmp_tokens = New_Token_Buffer();
00734
00735
00736 CONTEXT_reset_incomplete_ty2c(context);
00737 Set_TY_is_translated_to_c(ty);
00738 TY2C_complete_struct(tmp_tokens, ty, context);
00739 Append_Token_Special(tmp_tokens, ';');
00740 Append_Indented_Newline(tmp_tokens, lines_between_decls);
00741 Write_And_Reclaim_Tokens(W2C_File[W2C_DOTH_FILE],
00742 NULL,
00743 &tmp_tokens);
00744 }
00745 }
00746
00747
00748
00749
00750
00751
00752 static void
00753 TY2C_Translate_Structure(TY_IDX ty,CONTEXT context)
00754 {
00755 TOKEN_BUFFER fld_tokens, struct_tokens;
00756 FLD_ITER fld_iter;
00757 const UINT current_indent = Current_Indentation();
00758 TY& ty_rt = Ty_Table[ty];
00759
00760
00761
00762
00763
00764
00765
00766 struct_tokens = New_Token_Buffer();
00767
00768
00769 if (TY_is_union(ty))
00770 Append_Token_String(struct_tokens, "union");
00771 else
00772 Append_Token_String(struct_tokens, "struct");
00773
00774 Append_Token_String(struct_tokens,
00775 Concat3_Strings(" ", W2CF_Symtab_Nameof_Ty(ty), " {"));
00776
00777
00778 Increment_Indentation();
00779 FLD_IDX flist = ty_rt.Fld();
00780
00781 if (flist != 0) {
00782 fld_iter = Make_fld_iter(TY_flist(ty_rt));
00783 do
00784 {
00785 FLD_HANDLE fld (fld_iter);
00786
00787 Append_Indented_Newline(struct_tokens,1);
00788
00789
00790 fld_tokens = New_Token_Buffer();
00791 Append_Token_String(fld_tokens,FLD_name(fld_iter));
00792
00793 TY2C_translate(fld_tokens, FLD_type(fld),context);
00794 Append_Token_Special(fld_tokens,';');
00795
00796 Append_And_Reclaim_Token_List(struct_tokens, &fld_tokens);
00797
00798 } while (!FLD_last_field (fld_iter++)) ;
00799 }
00800
00801
00802 Decrement_Indentation();
00803 Append_Indented_Newline(struct_tokens,1);
00804 Append_Token_String(struct_tokens, " } ;");
00805 Append_Indented_Newline(struct_tokens,1);
00806
00807 CONTEXT_reset_incomplete_ty2c(context);
00808
00809 Append_Indented_Newline(struct_tokens, 1);
00810
00811 Write_And_Reclaim_Tokens(W2C_File[W2C_DOTH_FILE],
00812 NULL,
00813 &struct_tokens);
00814
00815
00816 }
00817
00818
00819
00820
00821
00822
00823
00824
00825 static void
00826 TY2C_struct(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00827 {
00828
00829 const UINT current_indent = Current_Indentation();
00830
00831 if (!TY_is_translated_to_c(ty)) {
00832
00833 CONTEXT_reset_incomplete_ty2c (context);
00834
00835
00836 Set_Current_Indentation(0);
00837
00838
00839 Set_TY_is_translated_to_c(ty);
00840
00841
00842 TY2C_Translate_Structure(ty,context);
00843
00844 Set_Current_Indentation(current_indent);
00845
00846 }
00847
00848 if (Compile_Upc) {
00849
00850 if (strcmp(W2CF_Symtab_Nameof_Ty(ty),"pshared_ptr_struct") == 0) {
00851 Prepend_Token_String(decl_tokens, "upcr_pshared_ptr_t");
00852 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00853 return;
00854 }
00855 if (strcmp(W2CF_Symtab_Nameof_Ty(ty),"shared_ptr_struct") == 0) {
00856 Prepend_Token_String(decl_tokens, "upcr_shared_ptr_t");
00857 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00858 return;
00859 }
00860 }
00861
00862 if (TY_is_translated_to_c(ty)){
00863 Prepend_Token_String(decl_tokens, W2CF_Symtab_Nameof_Ty(ty));
00864 BOOL is_equivalenced = Stab_Is_Equivalenced_Struct(ty);
00865
00866 if (TY_is_union(ty) )
00867 Prepend_Token_String(decl_tokens, "union");
00868 else
00869 Prepend_Token_String(decl_tokens, "struct");
00870
00871 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00872 }
00873
00874
00875 }
00876
00877
00878 static void
00879 TY2C_function(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00880 {
00881 TYLIST_IDX params = TY_parms(ty);
00882
00883
00884 CONTEXT_reset_unqualified_ty2c(context);
00885
00886
00887 CONTEXT_set_incomplete_ty2c(context);
00888
00889
00890 Append_Token_Special(decl_tokens, '(');
00891 if (TY_has_prototype(ty))
00892 {
00893 TY2C_prototype_params(decl_tokens, params, context);
00894 if (TY_is_varargs(ty))
00895 {
00896 Append_Token_Special(decl_tokens, ',');
00897 Append_Token_String(decl_tokens, "...");
00898 }
00899 }
00900 Append_Token_Special(decl_tokens, ')');
00901
00902
00903 TY2C_translate(decl_tokens, W2X_Unparse_Target->Func_Return_Type(ty), context);
00904 }
00905
00906
00907 static void
00908 TY2C_pointer(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00909 {
00910
00911 TY_IDX sptr_idx = 0;
00912
00913
00914
00915 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00916
00917
00918
00919 if (!TY_is_shared(TY_pointed(ty))) {
00920 Prepend_Token_Special(decl_tokens, '*');
00921 } else
00922
00923
00924 if(Type_Is_Shared_Ptr(ty)) {
00925 sptr_idx = TY_To_Sptr_Idx(ty);
00926 }
00927
00928
00929 if (TY_Is_Array_Or_Function(TY_pointed(ty)))
00930 WHIRL2C_parenthesize(decl_tokens);
00931
00932 CONTEXT_reset_unqualified_ty2c(context);
00933 CONTEXT_set_incomplete_ty2c(context);
00934 if(!sptr_idx)
00935 TY2C_translate(decl_tokens, TY_pointed(ty), context);
00936 else
00937 TY2C_translate(decl_tokens, sptr_idx, context);
00938 }
00939
00940
00941 static void
00942 TY2C_void(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00943 {
00944 Prepend_Token_String(decl_tokens, Special_Void_TypeName);
00945 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00946 }
00947
00948
00949 static void
00950 TY2C_invalid(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00951 {
00952 Is_True(FALSE, ("Invalid TY kind (%d) for translation to C", TY_kind(ty)));
00953 }
00954
00955
00956
00957
00958
00959 void
00960 TY2C_initialize(CONTEXT context)
00961 {
00962
00963
00964
00965
00966 Set_TY_is_translated_to_c(Be_Type_Tbl(MTYPE_STRING));
00967 Set_TY_is_translated_to_c(Be_Type_Tbl(MTYPE_C4));
00968 Set_TY_is_translated_to_c(Be_Type_Tbl(MTYPE_C8));
00969 Set_TY_is_translated_to_c(Be_Type_Tbl(MTYPE_CQ));
00970 }
00971
00972
00973 void
00974 TY2C_finalize(void)
00975 {
00976 return;
00977 }
00978
00979
00980 void
00981 TY2C_translate(TOKEN_BUFFER decl_tokens, TY_IDX ty, CONTEXT context)
00982 {
00983
00984
00985
00986 const char *special_name = GET_SPECIAL_TYPENAME(TY_mtype(ty));
00987
00988 if (special_name != NULL)
00989 {
00990 Prepend_Token_String(decl_tokens, special_name);
00991 TY2C_prepend_qualifiers(decl_tokens, ty, context);
00992 }
00993 else
00994 {
00995 Is_True((TY_KIND)TY_kind(ty) < KIND_LAST && TY_kind(ty) > KIND_INVALID,
00996 ("Unexpected TY_kind (%d) in TY2C_translate()", TY_kind(ty)));
00997 TY2C_Handle[(TY_KIND)TY_kind(ty)](decl_tokens, ty, context);
00998 }
00999 }
01000
01001
01002 void
01003 TY2C_translate_unqualified(TOKEN_BUFFER decl_tokens, TY_IDX ty)
01004 {
01005
01006
01007 CONTEXT context;
01008
01009 CONTEXT_reset(context);
01010 CONTEXT_set_unqualified_ty2c(context);
01011
01012 if (Compile_Upc && TY_kind(ty) == KIND_STRUCT) {
01013 CONTEXT_set_incomplete_ty2c(context);
01014 }
01015
01016 TY2C_translate(decl_tokens, ty, context);
01017 }
01018
01019
01020 TY2C_FLD_INFO
01021 TY2C_get_field_info(TY_IDX struct_ty,
01022 TY_IDX desired_ty,
01023 MTYPE desired_mty,
01024 INT64 desired_offset)
01025 {
01026
01027
01028
01029
01030
01031
01032
01033
01034 TY_IDX this_ty;
01035 FLD_HANDLE this_fld;
01036 FLD_HANDLE next_fld;
01037 TY2C_FLD_INFO this_fld_info;
01038 const INT64 struct_size = TY_size(struct_ty);
01039 const INT64 struct_align = TY_align(struct_ty);
01040 BOOL found_ty = FALSE, found_mty = FALSE;
01041
01042
01043 this_fld = TY_flist(Ty_Table[struct_ty]);
01044 if (!this_fld.Is_Null () && !TY_is_union(struct_ty))
01045 {
01046
01047
01048
01049
01050 for (next_fld = skip_till_next_field(this_fld,
01051 struct_align,
01052 struct_size,
01053 FALSE);
01054 !next_fld.Is_Null() && FLD_ofst(next_fld) <= desired_offset;
01055 next_fld = skip_till_next_field(next_fld,
01056 struct_align,
01057 struct_size,
01058 FALSE))
01059 {
01060 this_fld = next_fld;
01061 }
01062 }
01063 else if (!this_fld.Is_Null ())
01064 {
01065 next_fld = skip_till_next_field(this_fld,
01066 struct_align,
01067 struct_size,
01068 TRUE);
01069 }
01070
01071
01072
01073
01074
01075
01076 while (!found_ty && !this_fld.Is_Null () &&
01077 FLD_ofst(this_fld) <= desired_offset)
01078 {
01079 this_ty = FLD_type(this_fld);
01080
01081 if (!PTR_OR_ALIGNED_WITH_STRUCT(this_ty, struct_align) ||
01082 (!TY_is_union(struct_ty) &&
01083 FLD_Is_Bitfield(this_fld, FLD_next(this_fld),
01084 struct_size - FLD_ofst(this_fld))))
01085 {
01086
01087
01088
01089
01090
01091 }
01092 else if (desired_offset == FLD_ofst(this_fld) &&
01093 Stab_Identical_Types(desired_ty, this_ty,
01094 FALSE,
01095 TRUE,
01096 TRUE))
01097 {
01098
01099 this_fld_info.found_fld = this_fld;
01100 this_fld_info.select_tokens = New_Token_Buffer();
01101 Append_Token_String(this_fld_info.select_tokens,
01102 W2CF_Symtab_Nameof_Fld(this_fld));
01103 found_ty = TRUE;
01104 }
01105 else if (TY_Is_Structured(this_ty))
01106 {
01107
01108
01109
01110
01111 this_fld_info =
01112 TY2C_get_field_info(this_ty,
01113 desired_ty,
01114 desired_mty,
01115 desired_offset-FLD_ofst(this_fld));
01116 if (!this_fld_info.found_fld.Is_Null ())
01117 {
01118
01119 Prepend_Token_Special(this_fld_info.select_tokens, '.');
01120 Prepend_Token_String(this_fld_info.select_tokens,
01121 W2CF_Symtab_Nameof_Fld(this_fld));
01122 found_ty = TRUE;
01123 }
01124 }
01125 else if (desired_offset == FLD_ofst(this_fld) &&
01126 desired_mty == TY_mtype(this_ty))
01127 {
01128
01129
01130
01131 this_fld_info.found_fld = this_fld;
01132 found_mty = TRUE;
01133 }
01134 if (!found_ty)
01135 {
01136 this_fld = next_fld;
01137 if (!this_fld.Is_Null ())
01138 next_fld = skip_till_next_field(this_fld,
01139 struct_align,
01140 struct_size,
01141 TY_is_union(struct_ty));
01142 }
01143 }
01144
01145 if (!found_ty && found_mty)
01146 {
01147
01148
01149
01150 this_fld_info.select_tokens = New_Token_Buffer();
01151 Append_Token_String(this_fld_info.select_tokens,
01152 W2CF_Symtab_Nameof_Fld(this_fld_info.found_fld));
01153 }
01154 if (found_ty || found_mty)
01155 {
01156
01157
01158
01159
01160 if (Stab_Is_Equivalenced_Struct(struct_ty))
01161 {
01162 Prepend_Token_Special(this_fld_info.select_tokens, '.');
01163 Prepend_Token_String(this_fld_info.select_tokens,
01164 TY2C_Aligned_Block_Name);
01165 }
01166 }
01167 else if (!found_ty)
01168 {
01169 this_fld_info.found_fld = FLD_HANDLE(0);
01170 }
01171 return this_fld_info;
01172 }
01173
01174
01175 BOOL
01176 TY2C_builtin(TY_IDX ty)
01177 {
01178 const char *name = GET_SPECIAL_TYPENAME(TY_mtype(ty));
01179
01180 return (name != NULL ||
01181 (TY_mtype(ty) <= MTYPE_PREDEF &&
01182 (TY_mtype(ty) != MTYPE_UNKNOWN || TY_kind(ty) == KIND_INVALID) &&
01183 Scalar_C_Names[TY_mtype(ty)].pseudo_name != NULL));
01184 }