357
// ----------------------------------------------------
358
// friend injection of GCC before version 4.1
359
// ----------------------------------------------------
361
advice execution ("% Puma::CCNameLookup::invisibleFriend(...)") : around () {
362
if (friend_injection)
363
*tjp->result () = false; // friends are always visible
368
// ----------------------------------------------------
354
369
// get the configuration and check whether the GNU mode is enabled
355
advice args (config) && within (derived ("Puma::Syntax")) &&
370
// ----------------------------------------------------
372
bool get_gnu_version (const Puma::Config &config,
373
int &major, int &minor, int &patchlevel) {
374
const Puma::ConfOption *gnu_option = config.Option ("--gnu");
380
const char *gnu_version_str =
381
(gnu_option->Arguments() == 1) ? gnu_option->Argument (0) : 0;
382
if (gnu_version_str) {
384
istringstream in (gnu_version_str);
385
if (in.good()) in >> major;
386
if (in.good()) in >> sep >> minor;
387
if (in.good()) in >> sep >> patchlevel;
392
advice args (config) &&
393
execution("void Puma::CScanner::configure (...)"):
394
after (const Puma::Config &config) {
395
int gnu_major, gnu_minor, gnu_patchlevel;
396
// call get_gnu_version to check whether --gnu was given
397
if (get_gnu_version (config, gnu_major, gnu_minor, gnu_patchlevel)) {
398
if (gnu_major == -1 || (gnu_major >= 4 && gnu_minor >= 3)) {
399
// set the builtin type traits option (implemented by g++ >= 4.3)
400
tjp->that()->allow_type_traits (true);
405
advice args (config) && within (derived ("Puma::Syntax")) &&
356
406
execution ("void Puma::%::configure(...)"): before (Puma::Config &config) {
357
if (config.Option ("--gnu") || config.Option ("--gnu-2.95")) {
407
int gnu_major, gnu_minor, gnu_patchlevel;
408
// call get_gnu_version to check whether --gnu was given
409
if (get_gnu_version (config, gnu_major, gnu_minor, gnu_patchlevel)) {
410
// settings for all gcc dialects
358
411
extended_asm = true;
359
412
extended_cv_qual = true;
360
413
gnu_builtins = true;
361
414
typeof_keyword = true;
362
415
statement_exprs = true;
363
416
labels_as_values = true;
417
extern_inline = true;
418
thread_local_storage_class = true;
420
if (gnu_major >= 0 && gnu_major < 3) {
422
friend_injection = true;
425
// these options can be explicitely set even without --gnu
365
426
if (config.Option ("--gnu-extended-asm"))
366
427
extended_asm = true;
367
if (config.Option ("--gnu-2.95") || config.Option ("--gnu-std-hack"))
428
if (config.Option ("--gnu-std-hack"))
430
if (config.Option ("--gnu-friend-injection"))
431
friend_injection = true;
371
434
// --------------------------------------------------
372
435
// support for unnamed struct/union members
373
436
// --------------------------------------------------
375
438
advice execution ("% Puma::CSyntax::member_decl()") : around () {
376
439
// 2: type_spec_seq ;
377
440
// 3: type_spec_seq member_declarator_list ;
378
441
Puma::CTree *&result = *(Puma::CTree**)tjp->result ();
379
if (! (tjp->that ()->parse (&JoinPoint::That::type_spec_seq) &&
380
tjp->that ()->opt(tjp->that ()->parse (&JoinPoint::That::member_declarator_list)) &&
442
if (! (tjp->that ()->parse (&JoinPoint::That::type_spec_seq) &&
443
tjp->that ()->opt(tjp->that ()->parse (&JoinPoint::That::member_declarator_list)) &&
381
444
tjp->that ()->parse (Puma::TOK_SEMI_COLON))) {
382
445
result = (Puma::CTree*)0;
384
447
tjp->that ()->semantic ().finish_decl ();
385
result = tjp->that ()->builder ().member_decl ();
448
result = tjp->that ()->builder ().member_decl ();
452
// --------------------------------------------------
453
// GNU defined macros
454
// --------------------------------------------------
456
advice execution ("void Puma::PreprocessorParser::defineGNUMacros()") : after () {
458
tjp->that ()->defUndefinedMacro ("__GNUC__", "2");
459
tjp->that ()->defUndefinedMacro ("__GNUC_MINOR__", "8");
460
tjp->that ()->defUndefinedMacro ("_GLIBCPP_EXTERN_TEMPLATE", "0");
461
tjp->that ()->defUndefinedMacro ("__null", "0");
462
tjp->that ()->defUndefinedMacro ("__extension__", " ");
463
tjp->that ()->defUndefinedMacro ("_WCHAR_T_", " ");
465
if (! tjp->that ()->_macroManager->getMacro ("__attribute__")) {
466
Puma::PreMacro::MacroArgs *args = new Puma::PreMacro::MacroArgs ();
467
args->append ("par1");
468
tjp->that ()->_macroManager->addMacro (new Puma::PreMacro ("__attribute__", args, " "));
470
if (! tjp->that ()->_macroManager->getMacro ("__attribute")) {
471
Puma::PreMacro::MacroArgs *args = new Puma::PreMacro::MacroArgs ();
472
args->append ("par1");
473
tjp->that ()->_macroManager->addMacro (new Puma::PreMacro ("__attribute", args, " "));
475
// variable argument list access
476
if (! tjp->that ()->_macroManager->getMacro ("__builtin_va_arg")) {
477
Puma::PreMacro::MacroArgs *args = new Puma::PreMacro::MacroArgs ();
478
args->append ("par1");
479
args->append ("par2");
480
tjp->that ()->_macroManager->addMacro (new Puma::PreMacro ("__builtin_va_arg", args,
481
"((par2)__builtin_va_arg_helper(par1))"));
484
// atomic memory access built-in functions
486
// #define __sync_...(arg,...) *(typeof(arg))__generic_sync_...(arg, ## __VA_ARGS__)
487
#define __puma_defSyncMacro(opname) \
488
if (! tjp->that ()->_macroManager->getMacro ("__sync_" opname)) { \
489
Puma::PreMacro::MacroArgs *args = new Puma::PreMacro::MacroArgs (2); \
490
args->append ("par1"); \
491
args->append ("__VA_ARGS__"); \
492
tjp->that ()->_macroManager->addMacro (new Puma::PreMacro ("__sync_" opname, args, \
493
"*(typeof(par1))__generic_sync_" opname "(par1, ## __VA_ARGS__)", Puma::PreMacro::VAR_ARG_MACRO)); \
495
__puma_defSyncMacro("fetch_and_add");
496
__puma_defSyncMacro("fetch_and_add");
497
__puma_defSyncMacro("fetch_and_sub");
498
__puma_defSyncMacro("fetch_and_or");
499
__puma_defSyncMacro("fetch_and_and");
500
__puma_defSyncMacro("fetch_and_xor");
501
__puma_defSyncMacro("fetch_and_nand");
502
__puma_defSyncMacro("add_and_fetch");
503
__puma_defSyncMacro("sub_and_fetch");
504
__puma_defSyncMacro("or_and_fetch");
505
__puma_defSyncMacro("and_and_fetch");
506
__puma_defSyncMacro("xor_and_fetch");
507
__puma_defSyncMacro("nand_and_fetch");
508
__puma_defSyncMacro("val_compare_and_swap");
509
__puma_defSyncMacro("lock_test_and_set");
511
// built-in versions of the ISO C99 floating point comparison macros
512
// map to its originals
513
tjp->that ()->defUndefinedMacro ("__builtin_isgreater", "isgreater");
514
tjp->that ()->defUndefinedMacro ("__builtin_isgreaterequal", "isgreaterequal");
515
tjp->that ()->defUndefinedMacro ("__builtin_isless", "isless");
516
tjp->that ()->defUndefinedMacro ("__builtin_islessequal", "islessequal");
517
tjp->that ()->defUndefinedMacro ("__builtin_islessgreater", "islessgreater");
518
tjp->that ()->defUndefinedMacro ("__builtin_isunordered", "isunordered");
520
// implementation of ?: without side effects in not chosen alternative
521
// type __builtin_choose_expr (const_exp, exp1, exp2)
522
if (! tjp->that ()->_macroManager->getMacro ("__builtin_choose_expr")) {
523
Puma::PreMacro::MacroArgs *args = new Puma::PreMacro::MacroArgs ();
524
args->append ("const_exp");
525
args->append ("exp1");
526
args->append ("exp2");
527
tjp->that ()->_macroManager->addMacro (new Puma::PreMacro ("__builtin_choose_expr", args, "(exp1)"));
390
ExtGnu () : extended_asm (false), extended_cv_qual (false),
391
gnu_builtins (false), std_hack (false), typeof_keyword (false),
392
statement_exprs (false)
533
extended_asm (false),
534
extended_cv_qual (false),
535
gnu_builtins (false),
537
typeof_keyword (false),
538
statement_exprs (false),
539
labels_as_values (false),
540
thread_local_storage_class (false),
541
friend_injection (false),
542
extern_inline (false)
675
841
slice void Puma::ExtGnuBuiltinsSemantic::define_gnu_builtins () {
676
// declare gnu-specific builtin functions
842
// declare GNU built-ins
678
844
Puma::CFunctionInfo *info;
679
845
Puma::CTypeInfo *type;
680
846
Puma::CTypeList *args;
684
// void *__builtin_memcpy(void *dest, const void *src, size_t n)
685
args = new Puma::CTypeList (3);
686
type = new Puma::CTypePointer (&Puma::CTYPE_VOID); // void*
687
args->AddEntry (type);
688
type = new Puma::CTypeQualified (&Puma::CTYPE_VOID, true, false, false);
689
type = new Puma::CTypePointer (type);
690
args->AddEntry (type); // const void*
691
args->AddEntry (Puma::CTypeInfo::CTYPE_SIZE_T);
692
type = new Puma::CTypePointer (&Puma::CTYPE_VOID); // void*
693
type = new Puma::CTypeFunction (type, args, true);
694
info = createFunction ("__builtin_memcpy", current_scope, type);
695
createParameter (info, args->Entry (0));
696
createParameter (info, args->Entry (1));
697
createParameter (info, args->Entry (2));
701
// char *__builtin_strchr(const char *s, int c);
702
args = new Puma::CTypeList (2);
703
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
704
type = new Puma::CTypePointer (type);
705
args->AddEntry (type); // const char*
706
args->AddEntry (&Puma::CTYPE_INT); // int
707
type = new Puma::CTypePointer (&Puma::CTYPE_CHAR);
708
type = new Puma::CTypeFunction (type, args, true);
709
info = createFunction ("__builtin_strchr", current_scope, type);
710
createParameter (info, args->Entry (0));
711
createParameter (info, args->Entry (1));
713
// char *__builtin_strrchr(const char *s, int c);
714
args = new Puma::CTypeList (2);
715
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
716
type = new Puma::CTypePointer (type);
717
args->AddEntry (type); // const char*
718
args->AddEntry (&Puma::CTYPE_INT); // int
719
type = new Puma::CTypePointer (&Puma::CTYPE_CHAR);
720
type = new Puma::CTypeFunction (type, args, true);
721
info = createFunction ("__builtin_strrchr", current_scope, type);
722
createParameter (info, args->Entry (0));
723
createParameter (info, args->Entry (1));
725
// char *__builtin_strpbrk(const char *s, const char *accept);
726
args = new Puma::CTypeList (2);
727
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
728
type = new Puma::CTypePointer (type);
729
args->AddEntry (type); // const char*
730
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
731
type = new Puma::CTypePointer (type);
732
args->AddEntry (type); // const char*
733
type = new Puma::CTypePointer (&Puma::CTYPE_CHAR);
734
type = new Puma::CTypeFunction (type, args, true);
735
info = createFunction ("__builtin_strpbrk", current_scope, type);
736
createParameter (info, args->Entry (0));
737
createParameter (info, args->Entry (1));
739
// char *__builtin_strstr(const char *haystack, const char *needle);
740
args = new Puma::CTypeList (2);
741
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
742
type = new Puma::CTypePointer (type);
743
args->AddEntry (type); // const char*
744
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
745
type = new Puma::CTypePointer (type);
746
args->AddEntry (type); // const char*
747
type = new Puma::CTypePointer (&Puma::CTYPE_CHAR);
748
type = new Puma::CTypeFunction (type, args, true);
749
info = createFunction ("__builtin_strstr", current_scope, type);
750
createParameter (info, args->Entry (0));
751
createParameter (info, args->Entry (1));
755
// double __builtin_fabs(double x)
756
args = new Puma::CTypeList (1);
757
args->AddEntry (&Puma::CTYPE_DOUBLE); // double
758
type = new Puma::CTypeFunction (&Puma::CTYPE_DOUBLE, args, true);
759
info = createFunction ("__builtin_fabs", current_scope, type);
760
createParameter (info, args->Entry (0));
762
// float __builtin_fabsf(float x)
763
args = new Puma::CTypeList (1);
764
args->AddEntry (&Puma::CTYPE_FLOAT); //double
765
type = new Puma::CTypeFunction (&Puma::CTYPE_FLOAT, args, true);
766
info = createFunction ("__builtin_fabsf", current_scope, type);
767
createParameter (info, args->Entry (0));
769
// long double __builtin_fabsl(long double x)
770
args = new Puma::CTypeList (1);
771
args->AddEntry (&Puma::CTYPE_LONG_DOUBLE); // double
772
type = new Puma::CTypeFunction (&Puma::CTYPE_LONG_DOUBLE, args, true);
773
info = createFunction ("__builtin_fabsl", current_scope, type);
774
createParameter (info, args->Entry (0));
776
// float __builtin_cosf(float x)
777
args = new Puma::CTypeList (1);
778
args->AddEntry (&Puma::CTYPE_FLOAT); //double
779
type = new Puma::CTypeFunction (&Puma::CTYPE_FLOAT, args, true);
780
info = createFunction ("__builtin_cosf", current_scope, type);
781
createParameter (info, args->Entry (0));
783
// long double __builtin_cosl(long double x)
784
args = new Puma::CTypeList (1);
785
args->AddEntry (&Puma::CTYPE_LONG_DOUBLE); // double
786
type = new Puma::CTypeFunction (&Puma::CTYPE_LONG_DOUBLE, args, true);
787
info = createFunction ("__builtin_cosl", current_scope, type);
788
createParameter (info, args->Entry (0));
790
// float __builtin_sinf(float x)
791
args = new Puma::CTypeList (1);
792
args->AddEntry (&Puma::CTYPE_FLOAT); //double
793
type = new Puma::CTypeFunction (&Puma::CTYPE_FLOAT, args, true);
794
info = createFunction ("__builtin_sinf", current_scope, type);
795
createParameter (info, args->Entry (0));
797
// long double __builtin_sinl(long double x)
798
args = new Puma::CTypeList (1);
799
args->AddEntry (&Puma::CTYPE_LONG_DOUBLE); // double
800
type = new Puma::CTypeFunction (&Puma::CTYPE_LONG_DOUBLE, args, true);
801
info = createFunction ("__builtin_sinl", current_scope, type);
802
createParameter (info, args->Entry (0));
804
// float __builtin_sqrtf(float x)
805
args = new Puma::CTypeList (1);
806
args->AddEntry (&Puma::CTYPE_FLOAT); //double
807
type = new Puma::CTypeFunction (&Puma::CTYPE_FLOAT, args, true);
808
info = createFunction ("__builtin_sqrtf", current_scope, type);
809
createParameter (info, args->Entry (0));
811
// long double __builtin_sqrtl(long double x)
812
args = new Puma::CTypeList (1);
813
args->AddEntry (&Puma::CTYPE_LONG_DOUBLE); // double
814
type = new Puma::CTypeFunction (&Puma::CTYPE_LONG_DOUBLE, args, true);
815
info = createFunction ("__builtin_sqrtl", current_scope, type);
816
createParameter (info, args->Entry (0));
849
// function name constants
851
Puma::CAttributeInfo *attr;
853
// static const char __func__[] = "function-name";
854
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
855
type = new Puma::CTypeArray (type);
856
type->TypeArray ()->Dimension (1);
857
attr = createAttribute ("__func__", current_scope, type, true);
859
// static const char __FUNCTION__[] = "function-name";
860
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
861
type = new Puma::CTypeArray (type);
862
type->TypeArray ()->Dimension (1);
863
attr = createAttribute ("__FUNCTION__", current_scope, type, true);
865
// static const char __PRETTY_FUNCTION__[] = "function-name";
866
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
867
type = new Puma::CTypeArray (type);
868
type->TypeArray ()->Dimension (1);
869
attr = createAttribute ("__PRETTY_FUNCTION__", current_scope, type, true);
872
// variable arguments access
874
// void __builtin_stdarg_start(...)
875
args = new Puma::CTypeList (1);
876
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
877
type = new Puma::CTypeFunction (&Puma::CTYPE_VOID, args, true);
878
info = createFunction ("__builtin_stdarg_start", current_scope, type);
879
createParameter (info, args->Entry (0));
881
// void __builtin_va_start(...)
882
args = new Puma::CTypeList (1);
883
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
884
type = new Puma::CTypeFunction (&Puma::CTYPE_VOID, args, true);
885
info = createFunction ("__builtin_va_start", current_scope, type);
886
createParameter (info, args->Entry (0));
888
// hm, __builtin_va_arg is a problem as it has a variable result type
889
// I use int __builtin_va_start_helper(...)
890
args = new Puma::CTypeList (1);
891
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
892
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
893
info = createFunction ("__builtin_va_arg_helper", current_scope, type);
894
createParameter (info, args->Entry (0));
896
// void __builtin_va_end(...)
897
args = new Puma::CTypeList (1);
898
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
899
type = new Puma::CTypeFunction (&Puma::CTYPE_VOID, args, true);
900
info = createFunction ("__builtin_va_end", current_scope, type);
901
createParameter (info, args->Entry (0));
903
// typedef void *__builtin_va_list
904
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
905
createTypedef ("__builtin_va_list", current_scope, type);
819
908
// debug/frame access functions
975
1035
info = createFunction ("__builtin_expect", current_scope, type);
976
1036
createParameter (info, args->Entry (0));
977
1037
createParameter (info, args->Entry (1));
979
// int __builtin_constant_p (...)
980
args = new Puma::CTypeList (1);
981
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
982
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
983
info = createFunction ("__builtin_constant_p", current_scope, type);
984
createParameter (info, args->Entry (0));
987
// builtin typedefs (shouldn't be here!)
989
// typedef void *__builtin_va_list
990
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
991
createTypedef ("__builtin_va_list", current_scope, type);
994
// builtin attributes
995
Puma::CAttributeInfo *attr;
997
// static const char *__func__;
998
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
999
type = new Puma::CTypePointer (type);
1000
attr = createAttribute ("__func__", current_scope, type, true);
1002
// static const char *__FUNCTION__;
1003
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
1004
type = new Puma::CTypePointer (type);
1005
attr = createAttribute ("__FUNCTION__", current_scope, type, true);
1007
// static const char *__PRETTY_FUNCTION__;
1008
type = new Puma::CTypeQualified (&Puma::CTYPE_CHAR, true, false, false);
1009
type = new Puma::CTypePointer (type);
1010
attr = createAttribute ("__PRETTY_FUNCTION__", current_scope, type, true);
1039
// void __builtin_prefetch (const void *addr, ...)
1040
args = new Puma::CTypeList (2);
1041
type = new Puma::CTypeQualified (&Puma::CTYPE_VOID, true, false, false);
1042
args->AddEntry (new Puma::CTypePointer (type)); // const void*
1043
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1044
type = new Puma::CTypeFunction (&Puma::CTYPE_VOID, args, true);
1045
info = createFunction ("__builtin_prefetch", current_scope, type);
1046
createParameter (info, args->Entry (0));
1047
createParameter (info, args->Entry (1));
1052
// int __builtin_ffs (unsigned int x)
1053
args = new Puma::CTypeList (1);
1054
args->AddEntry (&Puma::CTYPE_UNSIGNED_INT);
1055
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1056
info = createFunction ("__builtin_ffs", current_scope, type);
1057
createParameter (info, args->Entry (0));
1059
// int __builtin_clz (unsigned int x)
1060
args = new Puma::CTypeList (1);
1061
args->AddEntry (&Puma::CTYPE_UNSIGNED_INT);
1062
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1063
info = createFunction ("__builtin_clz", current_scope, type);
1064
createParameter (info, args->Entry (0));
1066
// int __builtin_ctz (unsigned int x)
1067
args = new Puma::CTypeList (1);
1068
args->AddEntry (&Puma::CTYPE_UNSIGNED_INT);
1069
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1070
info = createFunction ("__builtin_ctz", current_scope, type);
1071
createParameter (info, args->Entry (0));
1073
// int __builtin_popcount (unsigned int x)
1074
args = new Puma::CTypeList (1);
1075
args->AddEntry (&Puma::CTYPE_UNSIGNED_INT);
1076
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1077
info = createFunction ("__builtin_popcount", current_scope, type);
1078
createParameter (info, args->Entry (0));
1080
// int __builtin_parity (unsigned int x)
1081
args = new Puma::CTypeList (1);
1082
args->AddEntry (&Puma::CTYPE_UNSIGNED_INT);
1083
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1084
info = createFunction ("__builtin_parity", current_scope, type);
1085
createParameter (info, args->Entry (0));
1087
// int __builtin_ffsl (unsigned long)
1088
args = new Puma::CTypeList (1);
1089
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG);
1090
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1091
info = createFunction ("__builtin_ffsl", current_scope, type);
1092
createParameter (info, args->Entry (0));
1094
// int __builtin_clzl (unsigned long)
1095
args = new Puma::CTypeList (1);
1096
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG);
1097
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1098
info = createFunction ("__builtin_clzl", current_scope, type);
1099
createParameter (info, args->Entry (0));
1101
// int __builtin_ctzl (unsigned long)
1102
args = new Puma::CTypeList (1);
1103
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG);
1104
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1105
info = createFunction ("__builtin_ctzl", current_scope, type);
1106
createParameter (info, args->Entry (0));
1108
// int __builtin_popcountl (unsigned long)
1109
args = new Puma::CTypeList (1);
1110
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG);
1111
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1112
info = createFunction ("__builtin_popcountl", current_scope, type);
1113
createParameter (info, args->Entry (0));
1115
// int __builtin_parityl (unsigned long)
1116
args = new Puma::CTypeList (1);
1117
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG);
1118
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1119
info = createFunction ("__builtin_parityl", current_scope, type);
1120
createParameter (info, args->Entry (0));
1122
// int __builtin_ffsll (unsigned long long)
1123
args = new Puma::CTypeList (1);
1124
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG_LONG);
1125
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1126
info = createFunction ("__builtin_ffsll", current_scope, type);
1127
createParameter (info, args->Entry (0));
1129
// int __builtin_clzll (unsigned long long)
1130
args = new Puma::CTypeList (1);
1131
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG_LONG);
1132
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1133
info = createFunction ("__builtin_clzll", current_scope, type);
1134
createParameter (info, args->Entry (0));
1136
// int __builtin_ctzll (unsigned long long)
1137
args = new Puma::CTypeList (1);
1138
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG_LONG);
1139
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1140
info = createFunction ("__builtin_ctzll", current_scope, type);
1141
createParameter (info, args->Entry (0));
1143
// int __builtin_popcountll (unsigned long long)
1144
args = new Puma::CTypeList (1);
1145
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG_LONG);
1146
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1147
info = createFunction ("__builtin_popcountll", current_scope, type);
1148
createParameter (info, args->Entry (0));
1150
// int __builtin_parityll (unsigned long long)
1151
args = new Puma::CTypeList (1);
1152
args->AddEntry (&Puma::CTYPE_UNSIGNED_LONG_LONG);
1153
type = new Puma::CTypeFunction (&Puma::CTYPE_INT, args, true);
1154
info = createFunction ("__builtin_parityll", current_scope, type);
1155
createParameter (info, args->Entry (0));
1158
// power calculation
1160
// double __builtin_powi (double, int)
1161
args = new Puma::CTypeList (2);
1162
args->AddEntry (&Puma::CTYPE_DOUBLE); // double
1163
args->AddEntry (&Puma::CTYPE_INT); // int
1164
type = new Puma::CTypeFunction (&Puma::CTYPE_DOUBLE, args, true);
1165
info = createFunction ("__builtin_powi", current_scope, type);
1166
createParameter (info, args->Entry (0));
1167
createParameter (info, args->Entry (1));
1169
// float __builtin_powif (float, int)
1170
args = new Puma::CTypeList (2);
1171
args->AddEntry (&Puma::CTYPE_FLOAT); // float
1172
args->AddEntry (&Puma::CTYPE_INT); // int
1173
type = new Puma::CTypeFunction (&Puma::CTYPE_FLOAT, args, true);
1174
info = createFunction ("__builtin_powif", current_scope, type);
1175
createParameter (info, args->Entry (0));
1176
createParameter (info, args->Entry (1));
1178
// long double __builtin_powil (long double, int)
1179
args = new Puma::CTypeList (2);
1180
args->AddEntry (&Puma::CTYPE_LONG_DOUBLE); // long double
1181
args->AddEntry (&Puma::CTYPE_INT); // int
1182
type = new Puma::CTypeFunction (&Puma::CTYPE_LONG_DOUBLE, args, true);
1183
info = createFunction ("__builtin_powil", current_scope, type);
1184
createParameter (info, args->Entry (0));
1185
createParameter (info, args->Entry (1));
1188
// atomic memory access
1190
// void __sync_synchronize (...)
1191
args = new Puma::CTypeList (1);
1192
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1193
type = new Puma::CTypeFunction (&Puma::CTYPE_VOID, args, true);
1194
info = createFunction ("__sync_synchronize", current_scope, type);
1195
createParameter (info, args->Entry (0));
1197
// void __sync_lock_release (type *ptr, ...)
1198
args = new Puma::CTypeList (1);
1199
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1200
type = new Puma::CTypeFunction (&Puma::CTYPE_VOID, args, true);
1201
info = createFunction ("__sync_lock_release", current_scope, type);
1202
createParameter (info, args->Entry (0));
1204
// bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
1205
args = new Puma::CTypeList (1);
1206
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1207
type = new Puma::CTypeFunction (&Puma::CTYPE_BOOL, args, true);
1208
info = createFunction ("__sync_bool_compare_and_swap", current_scope, type);
1209
createParameter (info, args->Entry (0));
1211
// type __sync_fetch_and_add (type *ptr, type value, ...)
1212
args = new Puma::CTypeList (1);
1213
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1214
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1215
type = new Puma::CTypeFunction (type, args, true);
1216
info = createFunction ("__generic_sync_fetch_and_add", current_scope, type);
1217
createParameter (info, args->Entry (0));
1219
// type __sync_fetch_and_sub (type *ptr, type value, ...)
1220
args = new Puma::CTypeList (1);
1221
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1222
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1223
type = new Puma::CTypeFunction (type, args, true);
1224
info = createFunction ("__generic_sync_fetch_and_sub", current_scope, type);
1225
createParameter (info, args->Entry (0));
1227
// type __sync_fetch_and_or (type *ptr, type value, ...)
1228
args = new Puma::CTypeList (1);
1229
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1230
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1231
type = new Puma::CTypeFunction (type, args, true);
1232
info = createFunction ("__generic_sync_fetch_and_or", current_scope, type);
1233
createParameter (info, args->Entry (0));
1235
// type __sync_fetch_and_and (type *ptr, type value, ...)
1236
args = new Puma::CTypeList (1);
1237
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1238
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1239
type = new Puma::CTypeFunction (type, args, true);
1240
info = createFunction ("__generic_sync_fetch_and_and", current_scope, type);
1241
createParameter (info, args->Entry (0));
1243
// type __sync_fetch_and_xor (type *ptr, type value, ...)
1244
args = new Puma::CTypeList (1);
1245
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1246
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1247
type = new Puma::CTypeFunction (type, args, true);
1248
info = createFunction ("__generic_sync_fetch_and_xor", current_scope, type);
1249
createParameter (info, args->Entry (0));
1251
// type __sync_fetch_and_nand (type *ptr, type value, ...)
1252
args = new Puma::CTypeList (1);
1253
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1254
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1255
type = new Puma::CTypeFunction (type, args, true);
1256
info = createFunction ("__generic_sync_fetch_and_nand", current_scope, type);
1257
createParameter (info, args->Entry (0));
1259
// type __sync_add_and_fetch (type *ptr, type value, ...)
1260
args = new Puma::CTypeList (1);
1261
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1262
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1263
type = new Puma::CTypeFunction (type, args, true);
1264
info = createFunction ("__generic_sync_add_and_fetch", current_scope, type);
1265
createParameter (info, args->Entry (0));
1267
// type __sync_sub_and_fetch (type *ptr, type value, ...)
1268
args = new Puma::CTypeList (1);
1269
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1270
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1271
type = new Puma::CTypeFunction (type, args, true);
1272
info = createFunction ("__generic_sync_sub_and_fetch", current_scope, type);
1273
createParameter (info, args->Entry (0));
1275
// type __sync_or_and_fetch (type *ptr, type value, ...)
1276
args = new Puma::CTypeList (1);
1277
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1278
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1279
type = new Puma::CTypeFunction (type, args, true);
1280
info = createFunction ("__generic_sync_or_and_fetch", current_scope, type);
1281
createParameter (info, args->Entry (0));
1283
// type __sync_and_and_fetch (type *ptr, type value, ...)
1284
args = new Puma::CTypeList (1);
1285
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1286
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1287
type = new Puma::CTypeFunction (type, args, true);
1288
info = createFunction ("__generic_sync_and_and_fetch", current_scope, type);
1289
createParameter (info, args->Entry (0));
1291
// type __sync_xor_and_fetch (type *ptr, type value, ...)
1292
args = new Puma::CTypeList (1);
1293
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1294
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1295
type = new Puma::CTypeFunction (type, args, true);
1296
info = createFunction ("__generic_sync_xor_and_fetch", current_scope, type);
1297
createParameter (info, args->Entry (0));
1299
// type __sync_nand_and_fetch (type *ptr, type value, ...)
1300
args = new Puma::CTypeList (1);
1301
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1302
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1303
type = new Puma::CTypeFunction (type, args, true);
1304
info = createFunction ("__generic_sync_nand_and_fetch", current_scope, type);
1305
createParameter (info, args->Entry (0));
1307
// type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
1308
args = new Puma::CTypeList (1);
1309
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1310
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1311
type = new Puma::CTypeFunction (type, args, true);
1312
info = createFunction ("__generic_sync_val_compare_and_swap", current_scope, type);
1313
createParameter (info, args->Entry (0));
1315
// type __sync_lock_test_and_set (type *ptr, type value, ...)
1316
args = new Puma::CTypeList (1);
1317
args->AddEntry (&Puma::CTYPE_ELLIPSIS); // ...
1318
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1319
type = new Puma::CTypeFunction (type, args, true);
1320
info = createFunction ("__generic_sync_lock_test_and_set", current_scope, type);
1321
createParameter (info, args->Entry (0));
1324
// constructing function calls
1326
// void * __builtin_apply_args()
1327
args = new Puma::CTypeList (0);
1328
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1329
type = new Puma::CTypeFunction (type, args, true);
1330
info = createFunction ("__builtin_apply_args", current_scope, type);
1332
// void * __builtin_apply(void (*function)(), void *arguments, size_t size)
1333
args = new Puma::CTypeList (3);
1334
args->AddEntry (new Puma::CTypePointer (new Puma::CTypeFunction (&Puma::CTYPE_VOID, new Puma::CTypeList (0), true)));
1335
args->AddEntry (new Puma::CTypePointer (&Puma::CTYPE_VOID));
1336
args->AddEntry (Puma::CTypeInfo::CTYPE_SIZE_T);
1337
type = new Puma::CTypePointer (&Puma::CTYPE_VOID);
1338
type = new Puma::CTypeFunction (type, args, true);
1339
info = createFunction ("__builtin_apply", current_scope, type);
1340
createParameter (info, args->Entry (0));
1341
createParameter (info, args->Entry (1));
1342
createParameter (info, args->Entry (2));
1344
// void __builtin_return(void *result)
1345
args = new Puma::CTypeList (1);
1346
args->AddEntry (new Puma::CTypePointer (&Puma::CTYPE_VOID));
1347
type = new Puma::CTypeFunction (&Puma::CTYPE_VOID, args, true);
1348
info = createFunction ("__builtin_return", current_scope, type);
1349
createParameter (info, args->Entry (0));