comparison dmd/attrib.c @ 527:cecfee2d01a8

Added support for overloaded intrinsics. Added atomic intrinsics in the intrinsics.di header.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Wed, 20 Aug 2008 01:02:22 +0200
parents a34078905d01
children f79bbd1d0b27
comparison
equal deleted inserted replaced
526:642f6fa854e5 527:cecfee2d01a8
836 { 836 {
837 Expression* expr = (Expression *)args->data[0]; 837 Expression* expr = (Expression *)args->data[0];
838 expr = expr->semantic(sc); 838 expr = expr->semantic(sc);
839 if (!args || args->dim != 1 || !parseStringExp(expr, arg1str)) 839 if (!args || args->dim != 1 || !parseStringExp(expr, arg1str))
840 { 840 {
841 error("pragma intrinsic requires exactly 1 string literal parameter"); 841 error("requires exactly 1 string literal parameter");
842 fatal(); 842 fatal();
843 } 843 }
844 llvm_internal = LLVMintrinsic; 844 llvm_internal = LLVMintrinsic;
845 } 845 }
846 846
847 // pragma(notypeinfo) { typedecl(s) } 847 // pragma(notypeinfo) { typedecl(s) }
848 else if (ident == Id::no_typeinfo) 848 else if (ident == Id::no_typeinfo)
849 { 849 {
850 if (args && args->dim > 0) 850 if (args && args->dim > 0)
851 { 851 {
852 error("pragma no_typeinfo takes no parameters"); 852 error("takes no parameters");
853 fatal(); 853 fatal();
854 } 854 }
855 llvm_internal = LLVMno_typeinfo; 855 llvm_internal = LLVMno_typeinfo;
856 } 856 }
857 857
858 // pragma(nomoduleinfo) ; 858 // pragma(nomoduleinfo) ;
859 else if (ident == Id::no_moduleinfo) 859 else if (ident == Id::no_moduleinfo)
860 { 860 {
861 if (args && args->dim > 0) 861 if (args && args->dim > 0)
862 { 862 {
863 error("pragma no_moduleinfo takes no parameters"); 863 error("takes no parameters");
864 fatal(); 864 fatal();
865 } 865 }
866 llvm_internal = LLVMno_moduleinfo; 866 llvm_internal = LLVMno_moduleinfo;
867 } 867 }
868 868
869 // pragma(alloca) { funcdecl(s) } 869 // pragma(alloca) { funcdecl(s) }
870 else if (ident == Id::Alloca) 870 else if (ident == Id::Alloca)
871 { 871 {
872 if (args && args->dim > 0) 872 if (args && args->dim > 0)
873 { 873 {
874 error("pragma alloca takes no parameters"); 874 error("takes no parameters");
875 fatal(); 875 fatal();
876 } 876 }
877 llvm_internal = LLVMalloca; 877 llvm_internal = LLVMalloca;
878 } 878 }
879 879
880 // pragma(va_start) { templdecl(s) } 880 // pragma(va_start) { templdecl(s) }
881 else if (ident == Id::vastart) 881 else if (ident == Id::vastart)
882 { 882 {
883 if (args && args->dim > 0) 883 if (args && args->dim > 0)
884 { 884 {
885 error("pragma va_start takes no parameters"); 885 error("takes no parameters");
886 fatal(); 886 fatal();
887 } 887 }
888 llvm_internal = LLVMva_start; 888 llvm_internal = LLVMva_start;
889 } 889 }
890 890
891 // pragma(va_copy) { funcdecl(s) } 891 // pragma(va_copy) { funcdecl(s) }
892 else if (ident == Id::vacopy) 892 else if (ident == Id::vacopy)
893 { 893 {
894 if (args && args->dim > 0) 894 if (args && args->dim > 0)
895 { 895 {
896 error("pragma va_copy takes no parameters"); 896 error("takes no parameters");
897 fatal(); 897 fatal();
898 } 898 }
899 llvm_internal = LLVMva_copy; 899 llvm_internal = LLVMva_copy;
900 } 900 }
901 901
902 // pragma(va_end) { funcdecl(s) } 902 // pragma(va_end) { funcdecl(s) }
903 else if (ident == Id::vaend) 903 else if (ident == Id::vaend)
904 { 904 {
905 if (args && args->dim > 0) 905 if (args && args->dim > 0)
906 { 906 {
907 error("pragma va_end takes no parameters"); 907 error("takes no parameters");
908 fatal(); 908 fatal();
909 } 909 }
910 llvm_internal = LLVMva_end; 910 llvm_internal = LLVMva_end;
911 } 911 }
912 912
913 // pragma(va_arg) { templdecl(s) } 913 // pragma(va_arg) { templdecl(s) }
914 else if (ident == Id::vaarg) 914 else if (ident == Id::vaarg)
915 { 915 {
916 if (args && args->dim > 0) 916 if (args && args->dim > 0)
917 { 917 {
918 error("pragma va_arg takes no parameters"); 918 error("takes no parameters");
919 fatal(); 919 fatal();
920 } 920 }
921 llvm_internal = LLVMva_arg; 921 llvm_internal = LLVMva_arg;
922 } 922 }
923 923
926 { 926 {
927 Expression* expr = (Expression *)args->data[0]; 927 Expression* expr = (Expression *)args->data[0];
928 expr = expr->semantic(sc); 928 expr = expr->semantic(sc);
929 if (!args || args->dim != 1 || !parseStringExp(expr, arg1str)) 929 if (!args || args->dim != 1 || !parseStringExp(expr, arg1str))
930 { 930 {
931 error("pragma llvmdc requires exactly 1 string literal parameter"); 931 error("requires exactly 1 string literal parameter");
932 fatal(); 932 fatal();
933 } 933 }
934 else if (arg1str == "verbose") 934 else if (arg1str == "verbose")
935 { 935 {
936 sc->module->llvmForceLogging = true; 936 sc->module->llvmForceLogging = true;
937 } 937 }
938 else 938 else
939 { 939 {
940 error("pragma llvmdc command '%s' invalid"); 940 error("command '%s' invalid");
941 fatal(); 941 fatal();
942 } 942 }
943 } 943 }
944 944
945 #endif // LLVMDC 945 #endif // LLVMDC
998 if (FuncDeclaration* fd = s->isFuncDeclaration()) 998 if (FuncDeclaration* fd = s->isFuncDeclaration())
999 { 999 {
1000 fd->llvmInternal = llvm_internal; 1000 fd->llvmInternal = llvm_internal;
1001 fd->intrinsicName = arg1str; 1001 fd->intrinsicName = arg1str;
1002 } 1002 }
1003 else if (TemplateDeclaration* td = s->isTemplateDeclaration())
1004 {
1005 td->llvmInternal = llvm_internal;
1006 td->intrinsicName = arg1str;
1007 }
1003 else 1008 else
1004 { 1009 {
1005 error("the intrinsic pragma is only allowed on function declarations"); 1010 error("only allowed on function declarations");
1006 fatal(); 1011 fatal();
1007 } 1012 }
1008 break; 1013 break;
1009 1014
1010 case LLVMva_start: 1015 case LLVMva_start: