From: Steve Naroff Date: Thu, 25 Dec 2008 14:41:26 +0000 (+0000) Subject: Add parser support for __forceinline, __w64, __ptr64. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=86bc6cf05ad3ff7198671c394ba5157974e8a39c;p=clang Add parser support for __forceinline, __w64, __ptr64. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61431 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def index 686c1b5b2a..01a85c0a18 100644 --- a/include/clang/Basic/TokenKinds.def +++ b/include/clang/Basic/TokenKinds.def @@ -312,6 +312,9 @@ KEYWORD(__declspec , EXTC90|EXTC99|EXTCPP|EXTCPP0x) KEYWORD(__cdecl , EXTC90|EXTC99|EXTCPP|EXTCPP0x) KEYWORD(__stdcall , EXTC90|EXTC99|EXTCPP|EXTCPP0x) KEYWORD(__fastcall , EXTC90|EXTC99|EXTCPP|EXTCPP0x) +KEYWORD(__ptr64 , EXTC90|EXTC99|EXTCPP|EXTCPP0x) +KEYWORD(__w64 , EXTC90|EXTC99|EXTCPP|EXTCPP0x) +KEYWORD(__forceinline , EXTC90|EXTC99|EXTCPP|EXTCPP0x) // Alternate spelling for various tokens. There are GCC extensions in all // languages, but should not be disabled in strict conformance mode. diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index e68a44c188..aa2944f331 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -484,9 +484,6 @@ static void InitializePredefinedMacros(Preprocessor &PP, // mode. if (PP.getLangOptions().Microsoft) { DefineBuiltinMacro(Buf, "_cdecl=__cdecl"); - DefineBuiltinMacro(Buf, "__ptr64="); - DefineBuiltinMacro(Buf, "__w64="); - DefineBuiltinMacro(Buf, "__forceinline="); DefineBuiltinMacro(Buf, "__int8=char"); DefineBuiltinMacro(Buf, "__int16=short"); DefineBuiltinMacro(Buf, "__int32=int"); diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index bf75ab0e93..e3fd6961bf 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -561,6 +561,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, continue; // Microsoft single token adornments. + case tok::kw___forceinline: + case tok::kw___w64: case tok::kw___cdecl: case tok::kw___stdcall: case tok::kw___fastcall: @@ -1322,6 +1324,7 @@ void Parser::ParseTypeQualifierListOpt(DeclSpec &DS, bool AttributesAllowed) { isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, getLang())*2; break; + case tok::kw___ptr64: case tok::kw___cdecl: case tok::kw___stdcall: case tok::kw___fastcall: diff --git a/test/Parser/MicrosoftExtensions.c b/test/Parser/MicrosoftExtensions.c index dc26c57323..0ff59f75aa 100644 --- a/test/Parser/MicrosoftExtensions.c +++ b/test/Parser/MicrosoftExtensions.c @@ -6,3 +6,18 @@ void (*__fastcall fastpfunc)(); extern __declspec(dllimport) void __stdcall VarR4FromDec(); __declspec(deprecated) __declspec(deprecated) char * __cdecl ltoa( long _Val, char * _DstBuf, int _Radix); __declspec(noalias) __declspec(restrict) void * __cdecl xxx( void * _Memory ); +typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; +void * __ptr64 PtrToPtr64(const void *p) +{ + return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p ); +} +__forceinline InterlockedBitTestAndSet (long *Base, long Bit) +{ + __asm { + mov eax, Bit + mov ecx, Base + lock bts [ecx], eax + setc al + }; +} +