From: Chad Rosier Date: Mon, 22 Apr 2013 17:01:37 +0000 (+0000) Subject: [ms-inline asm] Refactor/clean up the SemaLookup interface. No functional X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1e7ca6211c77208c8a339c2a26e612be81c70ec5;p=clang [ms-inline asm] Refactor/clean up the SemaLookup interface. No functional change indended. Part of rdar://13663589 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@180027 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 26d9591375..352784e7ef 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -46,6 +46,7 @@ #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/MC/MCParser/MCAsmParser.h" #include #include @@ -820,6 +821,9 @@ public: bool OldFPContractState : 1; }; + typedef llvm::MCAsmParserSemaCallback::InlineAsmIdentifierInfo + InlineAsmIdentifierInfo; + public: Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind = TU_Complete, @@ -2797,9 +2801,8 @@ public: Expr *AsmString, MultiExprArg Clobbers, SourceLocation RParenLoc); - NamedDecl *LookupInlineAsmIdentifier(StringRef Name, SourceLocation Loc, - unsigned &Length, unsigned &Size, - unsigned &Type, bool &IsVarDecl); + NamedDecl *LookupInlineAsmIdentifier(StringRef &LineBuf, SourceLocation Loc, + InlineAsmIdentifierInfo &Info); bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset, SourceLocation AsmLoc); StmtResult ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 0ed0fd56f5..c646e7c857 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -445,14 +445,10 @@ public: : SemaRef(Ref), AsmLoc(Loc), AsmToks(Toks), TokOffsets(Offsets) { } ~MCAsmParserSemaCallbackImpl() {} - void *LookupInlineAsmIdentifier(StringRef Name, void *SrcLoc, - unsigned &Length, unsigned &Size, - unsigned &Type, bool &IsVarDecl){ - SourceLocation Loc = SourceLocation::getFromPtrEncoding(SrcLoc); - - NamedDecl *OpDecl = SemaRef.LookupInlineAsmIdentifier(Name, Loc, Length, - Size, Type, - IsVarDecl); + void *LookupInlineAsmIdentifier(StringRef &LineBuf, + InlineAsmIdentifierInfo &Info) { + SourceLocation Loc = SourceLocation::getFromPtrEncoding(LineBuf.data()); + NamedDecl *OpDecl = SemaRef.LookupInlineAsmIdentifier(LineBuf, Loc, Info); return static_cast(OpDecl); } @@ -520,19 +516,13 @@ static StringRef parseIdentifier(StringRef Identifier) { return StringRef(StartPtr, CurPtr - StartPtr); } -NamedDecl *Sema::LookupInlineAsmIdentifier(StringRef Name, SourceLocation Loc, - unsigned &Length, unsigned &Size, - unsigned &Type, bool &IsVarDecl) { +NamedDecl *Sema::LookupInlineAsmIdentifier(StringRef &LineBuf, SourceLocation Loc, + InlineAsmIdentifierInfo &Info) { + Info.clear(); // FIXME: Temporary hack until the frontend parser is hooked up to parse // variables. - StringRef ParsedName = parseIdentifier(Name); - assert (ParsedName == Name && "Identifier not parsed correctly!"); - - Length = 1; - Size = 0; - Type = 0; - IsVarDecl = false; - LookupResult Result(*this, &Context.Idents.get(Name), Loc, + LineBuf = parseIdentifier(LineBuf); + LookupResult Result(*this, &Context.Idents.get(LineBuf), Loc, Sema::LookupOrdinaryName); if (!LookupName(Result, getCurScope())) { @@ -551,13 +541,13 @@ NamedDecl *Sema::LookupInlineAsmIdentifier(StringRef Name, SourceLocation Loc, return FoundDecl; if (VarDecl *Var = dyn_cast(FoundDecl)) { QualType Ty = Var->getType(); - Type = Size = Context.getTypeSizeInChars(Ty).getQuantity(); + Info.Type = Info.Size = Context.getTypeSizeInChars(Ty).getQuantity(); if (Ty->isArrayType()) { const ArrayType *ATy = Context.getAsArrayType(Ty); - Type = Context.getTypeSizeInChars(ATy->getElementType()).getQuantity(); - Length = Size / Type; + Info.Type = Context.getTypeSizeInChars(ATy->getElementType()).getQuantity(); + Info.Length = Info.Size / Info.Type; } - IsVarDecl = true; + Info.IsVarDecl = true; return FoundDecl; }