mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 06:26:08 +00:00
- Add support for fuzzy parsing line-oriented __asm's (yuck).
- Change handling of __w64 to a built-in macro. llvm-svn: 46864
This commit is contained in:
parent
eef348687e
commit
4e79d340bd
@ -429,6 +429,7 @@ static void InitializePredefinedMacros(Preprocessor &PP,
|
||||
DefineBuiltinMacro(Buf, "__cdecl=");
|
||||
DefineBuiltinMacro(Buf, "_cdecl=");
|
||||
DefineBuiltinMacro(Buf, "__ptr64=");
|
||||
DefineBuiltinMacro(Buf, "__w64=");
|
||||
DefineBuiltinMacro(Buf, "__forceinline=");
|
||||
DefineBuiltinMacro(Buf, "__int8=char");
|
||||
DefineBuiltinMacro(Buf, "__int16=short");
|
||||
|
@ -483,8 +483,6 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS) {
|
||||
case tok::kw_typedef:
|
||||
isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_typedef, Loc, PrevSpec);
|
||||
break;
|
||||
case tok::kw___w64: // ignore Microsoft specifier
|
||||
break;
|
||||
case tok::kw___declspec:
|
||||
FuzzyParseMicrosoftDeclspec();
|
||||
// Don't consume the next token, __declspec's can appear one after
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
#include "clang/Parse/Parser.h"
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/Parse/DeclSpec.h"
|
||||
#include "clang/Parse/Scope.h"
|
||||
using namespace clang;
|
||||
@ -911,10 +912,21 @@ Parser::StmtResult Parser::ParseReturnStatement() {
|
||||
}
|
||||
|
||||
Parser::StmtResult Parser::FuzzyParseMicrosoftAsmStatement() {
|
||||
unsigned short savedBraceCount = BraceCount;
|
||||
do {
|
||||
ConsumeAnyToken();
|
||||
} while (BraceCount > savedBraceCount && Tok.isNot(tok::eof));
|
||||
if (Tok.is(tok::l_brace)) {
|
||||
unsigned short savedBraceCount = BraceCount;
|
||||
do {
|
||||
ConsumeAnyToken();
|
||||
} while (BraceCount > savedBraceCount && Tok.isNot(tok::eof));
|
||||
} else {
|
||||
// From the MS website: If used without braces, the __asm keyword means
|
||||
// that the rest of the line is an assembly-language statement.
|
||||
SourceManager &SrcMgr = PP.getSourceManager();
|
||||
unsigned lineNo = SrcMgr.getLineNumber(Tok.getLocation());
|
||||
do {
|
||||
ConsumeAnyToken();
|
||||
} while ((SrcMgr.getLineNumber(Tok.getLocation()) == lineNo) &&
|
||||
Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -937,7 +949,7 @@ Parser::StmtResult Parser::ParseAsmStatement(bool &msAsm) {
|
||||
assert(Tok.is(tok::kw_asm) && "Not an asm stmt");
|
||||
SourceLocation AsmLoc = ConsumeToken();
|
||||
|
||||
if (Tok.is(tok::l_brace)) {
|
||||
if (getLang().Microsoft && Tok.isNot(tok::l_paren)) {
|
||||
msAsm = true;
|
||||
return FuzzyParseMicrosoftAsmStatement();
|
||||
}
|
||||
|
@ -299,8 +299,7 @@ KEYWORD(__thread , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
|
||||
// Apple Extension.
|
||||
KEYWORD(__private_extern__ , EXTC90|EXTC99|NOTCPP)
|
||||
|
||||
// Microsoft Extensions.
|
||||
KEYWORD(__w64 , EXTC90|EXTC99|NOTCPP)
|
||||
// Microsoft Extension.
|
||||
KEYWORD(__declspec , EXTC90|EXTC99|NOTCPP)
|
||||
|
||||
// Alternate spelling for various tokens. There are GCC extensions in all
|
||||
|
Loading…
x
Reference in New Issue
Block a user