From f9c29d42005d8e974ab24099fb2660329ba54ede Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Thu, 25 Dec 2008 14:41:26 +0000 Subject: [PATCH] Add parser support for __forceinline, __w64, __ptr64. llvm-svn: 61431 --- clang/include/clang/Basic/TokenKinds.def | 3 +++ clang/lib/Lex/Preprocessor.cpp | 3 --- clang/lib/Parse/ParseDecl.cpp | 3 +++ clang/test/Parser/MicrosoftExtensions.c | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index 686c1b5b2a00..01a85c0a183f 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/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/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index e68a44c188b2..aa2944f331d5 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/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/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index bf75ab0e93e2..e3fd6961bf8f 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/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/clang/test/Parser/MicrosoftExtensions.c b/clang/test/Parser/MicrosoftExtensions.c index dc26c57323ad..0ff59f75aa46 100644 --- a/clang/test/Parser/MicrosoftExtensions.c +++ b/clang/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 + }; +} +