Mercurial > projects > ldc
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: |