24#include "llvm/ADT/ArrayRef.h"
25#include "llvm/ADT/StringExtras.h"
26#include "llvm/ADT/StringSet.h"
27#include "llvm/MC/MCParser/MCAsmParser.h"
35 Expr *ExprUnderCast =
nullptr;
39 ParentsToUpdate.push_back(
Parent);
40 if (
auto *ParenE = dyn_cast<ParenExpr>(
Parent)) {
41 Parent = ParenE->getSubExpr();
45 Expr *Child =
nullptr;
52 if (
auto *CastE = dyn_cast<CastExpr>(Child))
53 if (CastE->getCastKind() == CK_LValueToRValue) {
54 ExprUnderCast = CastE->getSubExpr();
63 assert(ExprUnderCast &&
64 "Should be reachable only if LValueToRValue cast was found!");
66 for (
Expr *E : ParentsToUpdate)
117 for (
unsigned p = 0, e = AsmStrPieces.size(); p != e; ++p) {
134 if (!Func->
hasAttr<NakedAttr>())
138 WorkList.push_back(E);
139 while (WorkList.size()) {
140 Expr *E = WorkList.pop_back_val();
141 if (isa<CXXThisExpr>(E)) {
143 S.
Diag(Func->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
147 if (isa<ParmVarDecl>(DRE->getDecl())) {
148 S.
Diag(DRE->getBeginLoc(), diag::err_asm_naked_parm_ref);
149 S.
Diag(Func->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
154 if (
Expr *E = dyn_cast_or_null<Expr>(Child))
155 WorkList.push_back(E);
165 bool is_input_expr) {
171 } EType = ExprSafeType;
176 EType = ExprBitfield;
178 EType = ExprVectorElt;
180 EType = ExprGlobalRegVar;
182 if (EType != ExprSafeType) {
183 S.
Diag(E->
getBeginLoc(), diag::err_asm_non_addr_value_in_memory_constraint)
199 const VarDecl *Variable = dyn_cast<VarDecl>(AsmDeclRef->getDecl());
200 if (Variable && Variable->getStorageClass() ==
SC_Register) {
201 if (AsmLabelAttr *
Attr = Variable->getAttr<AsmLabelAttr>())
202 if (
Target.isValidGCCRegisterName(
Attr->getLabel()))
203 return Target.getNormalizedGCCRegisterName(
Attr->getLabel(),
true);
217 llvm::StringSet<> InOutVars;
220 for (
unsigned int i = 0; i < Exprs.size() - NumLabels; ++i) {
221 StringRef Constraint = Constraints[i]->
getString();
222 StringRef InOutReg =
Target.getConstraintRegister(
225 InOutVars.insert(InOutReg);
229 for (
int i = 0; i < NumClobbers; ++i) {
230 StringRef Clobber = Clobbers[i]->
getString();
233 if (Clobber ==
"cc" || Clobber ==
"memory" || Clobber ==
"unwind")
235 Clobber =
Target.getNormalizedGCCRegisterName(Clobber,
true);
237 if (InOutVars.count(Clobber))
244 bool IsVolatile,
unsigned NumOutputs,
250 unsigned NumClobbers = clobbers.size();
262 llvm::StringMap<bool> FeatureMap;
265 for (
unsigned i = 0; i != NumOutputs; i++) {
267 assert(Literal->isOrdinary());
269 StringRef OutputName;
271 OutputName = Names[i]->
getName();
276 diag::err_asm_invalid_output_constraint)
280 NumInputs, Names, Constraints, Exprs.data(), AsmString,
281 NumClobbers, Clobbers, NumLabels, RParenLoc);
290 Expr *OutputExpr = Exprs[i];
309 OutputConstraintInfos.push_back(Info);
333 diag::err_dereference_incomplete_type))
338 diag::err_asm_invalid_lvalue_in_output)
344 FeatureMap, Literal->getString(), Size)) {
349 NumInputs, Names, Constraints, Exprs.data(), AsmString,
350 NumClobbers, Clobbers, NumLabels, RParenLoc);
356 for (
unsigned i = NumOutputs, e = NumOutputs + NumInputs; i != e; i++) {
358 assert(Literal->isOrdinary());
362 InputName = Names[i]->
getName();
367 targetDiag(Literal->getBeginLoc(), diag::err_asm_invalid_input_constraint)
371 NumInputs, Names, Constraints, Exprs.data(), AsmString,
372 NumClobbers, Clobbers, NumLabels, RParenLoc);
380 Expr *InputExpr = Exprs[i];
384 diag::err_asm_pmf_through_constraint_not_permitted)
400 diag::err_asm_invalid_lvalue_in_input)
408 InputExpr = Exprs[i] =
Result.get();
416 llvm::APSInt IntResult;
422 diag::err_invalid_asm_value_for_constraint)
445 InputConstraintInfos.push_back(Info);
447 const Type *Ty = Exprs[i]->getType().getTypePtr();
453 diag::err_dereference_incomplete_type))
458 Literal->getString(), Size))
460 diag::err_asm_invalid_input_size)
464 std::optional<SourceLocation> UnwindClobberLoc;
467 for (
unsigned i = 0; i != NumClobbers; i++) {
469 assert(Literal->isOrdinary());
471 StringRef Clobber = Literal->getString();
474 targetDiag(Literal->getBeginLoc(), diag::err_asm_unknown_register_name)
478 NumInputs, Names, Constraints, Exprs.data(), AsmString,
479 NumClobbers, Clobbers, NumLabels, RParenLoc);
482 if (Clobber ==
"unwind") {
483 UnwindClobberLoc = Literal->getBeginLoc();
488 if (UnwindClobberLoc && NumLabels > 0) {
489 targetDiag(*UnwindClobberLoc, diag::err_asm_unwind_and_goto);
492 Names, Constraints, Exprs.data(), AsmString, NumClobbers,
493 Clobbers, NumLabels, RParenLoc);
498 NumInputs, Names, Constraints, Exprs.data(),
499 AsmString, NumClobbers, Clobbers, NumLabels,
505 if (
unsigned DiagID =
NS->AnalyzeAsmString(Pieces,
Context, DiagOffs)) {
512 for (
unsigned i = 0, e = Pieces.size(); i != e; ++i) {
518 unsigned NumOperands =
NS->getNumOutputs() +
NS->getNumInputs();
520 if (
NS->isAsmGoto() && ConstraintIdx >= NumOperands)
524 if (ConstraintIdx >= NumOperands) {
525 unsigned I = 0, E =
NS->getNumOutputs();
527 for (
unsigned Cnt = ConstraintIdx - NumOperands; I != E; ++I)
528 if (OutputConstraintInfos[I].isReadWrite() && Cnt-- == 0) {
533 assert(I != E &&
"Invalid operand number should have been caught in "
534 " AnalyzeAsmString");
539 const Type *Ty = Exprs[ConstraintIdx]->getType().getTypePtr();
544 std::string SuggestedModifier;
547 SuggestedModifier)) {
548 targetDiag(Exprs[ConstraintIdx]->getBeginLoc(),
549 diag::warn_asm_mismatched_size_modifier);
551 if (!SuggestedModifier.empty()) {
553 diag::note_asm_missing_constraint_modifier)
554 << SuggestedModifier;
555 SuggestedModifier =
"%" + SuggestedModifier + Piece.
getString();
562 unsigned NumAlternatives = ~0
U;
563 for (
unsigned i = 0, e = OutputConstraintInfos.size(); i != e; ++i) {
566 unsigned AltCount = ConstraintStr.count(
',') + 1;
567 if (NumAlternatives == ~0
U) {
568 NumAlternatives = AltCount;
569 }
else if (NumAlternatives != AltCount) {
571 diag::err_asm_unexpected_constraint_alternatives)
572 << NumAlternatives << AltCount;
578 for (
unsigned i = 0, e = InputConstraintInfos.size(); i != e; ++i) {
581 unsigned AltCount = ConstraintStr.count(
',') + 1;
582 if (NumAlternatives == ~0
U) {
583 NumAlternatives = AltCount;
584 }
else if (NumAlternatives != AltCount) {
586 diag::err_asm_unexpected_constraint_alternatives)
587 << NumAlternatives << AltCount;
597 unsigned InputOpNo = i+NumOutputs;
598 Expr *OutputExpr = Exprs[TiedTo];
599 Expr *InputExpr = Exprs[InputOpNo];
602 assert(TiedTo < InputMatchedToOutput.size() &&
"TiedTo value out of range");
603 if (InputMatchedToOutput[TiedTo] != ~0
U) {
605 diag::err_asm_input_duplicate_match)
607 targetDiag(
NS->getInputExpr(InputMatchedToOutput[TiedTo])->getBeginLoc(),
608 diag::note_asm_input_duplicate_first)
612 InputMatchedToOutput[TiedTo] = i;
625 AD_Int, AD_FP, AD_Other
626 } InputDomain, OutputDomain;
629 InputDomain = AD_Int;
633 InputDomain = AD_Other;
636 OutputDomain = AD_Int;
638 OutputDomain = AD_FP;
640 OutputDomain = AD_Other;
650 if (OutSize == InSize && InputDomain == OutputDomain &&
651 InputDomain != AD_Other)
657 bool SmallerValueMentioned =
false;
665 SmallerValueMentioned |= InSize < OutSize;
670 SmallerValueMentioned |= OutSize < InSize;
676 if (!SmallerValueMentioned && InputDomain != AD_Other &&
677 OutputConstraintInfos[TiedTo].allowsRegister()) {
693 if (InputDomain == AD_Int && OutputDomain == AD_Int &&
697 (OutTy->
isBooleanType() ? CK_IntegralToBoolean : CK_IntegralCast);
699 Exprs[InputOpNo] = InputExpr;
700 NS->setInputExpr(i, InputExpr);
716 targetDiag(ConstraintLoc, diag::error_inoutput_conflict_with_clobber);
719 typedef std::pair<StringRef , Expr *> NamedOperand;
721 for (
unsigned i = 0, e = NumOutputs + NumInputs + NumLabels; i != e; ++i)
723 NamedOperandList.emplace_back(
724 std::make_pair(Names[i]->
getName(), Exprs[i]));
726 llvm::stable_sort(NamedOperandList, llvm::less_first());
729 std::adjacent_find(begin(NamedOperandList), end(NamedOperandList),
730 [](
const NamedOperand &LHS,
const NamedOperand &RHS) {
731 return LHS.first == RHS.first;
733 if (Found != NamedOperandList.end()) {
734 Diag((Found + 1)->second->getBeginLoc(),
735 diag::error_duplicate_asm_operand_name)
736 << (Found + 1)->first;
737 Diag(Found->second->getBeginLoc(), diag::note_duplicate_asm_operand_name)
750 llvm::InlineAsmIdentifierInfo &Info) {
754 return Info.setLabel(Res);
756 bool IsEnum = isa<clang::EnumType>(T);
757 if (
DeclRefExpr *DRE = dyn_cast<clang::DeclRefExpr>(Res))
758 if (DRE->getDecl()->getKind() == Decl::EnumConstant)
761 return Info.setEnum(Eval.
Val.
getInt().getSExtValue());
763 return Info.setLabel(Res);
766 unsigned Type = Size;
769 bool IsGlobalLV =
false;
772 Info.setVar(Res, IsGlobalLV, Size,
Type);
778 bool IsUnevaluatedContext) {
780 if (IsUnevaluatedContext)
791 if (IsUnevaluatedContext)
826 Member.split(Members,
".");
833 FoundDecl = PT->getPointeeType()->getAsTagDecl();
844 for (StringRef NextMember : Members) {
846 if (
VarDecl *VD = dyn_cast<VarDecl>(FoundDecl))
851 QualType QT = TD->getUnderlyingType();
855 }
else if (
TypeDecl *TD = dyn_cast<TypeDecl>(FoundDecl))
857 else if (
FieldDecl *TD = dyn_cast<FieldDecl>(FoundDecl))
863 diag::err_asm_incomplete_type))
877 FieldDecl *FD = dyn_cast<FieldDecl>(FoundDecl);
902 nullptr, NameInfo,
nullptr);
919 FD = dyn_cast<IndirectFieldDecl>(FieldResult.
getFoundDecl());
934 unsigned NumOutputs,
unsigned NumInputs,
939 bool IsSimple = (NumOutputs != 0 || NumInputs != 0);
942 bool InvalidOperand =
false;
943 for (uint64_t I = 0; I < NumOutputs + NumInputs; ++I) {
946 InvalidOperand =
true;
948 << E->
getType() << (I < NumOutputs)
951 InvalidOperand =
true;
963 true, AsmToks, NumOutputs, NumInputs,
964 Constraints, Exprs, AsmString,
975 if (
Label->isMSAsmLabel()) {
980 std::string InternalName;
981 llvm::raw_string_ostream
OS(InternalName);
987 OS <<
"__MSASMLABEL_.${:uid}__";
988 for (
char C : ExternalLabelName) {
994 Label->setMSAsmLabel(
OS.str());
1000 Label->setMSAsmLabelResolved();
1003 Label->setLocation(Location);
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::Preprocessor interface.
static std::string getName(const CallEvent &Call)
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
static SourceLocation getClobberConflictLocation(MultiExprArg Exprs, StringLiteral **Constraints, StringLiteral **Clobbers, int NumClobbers, unsigned NumLabels, const TargetInfo &Target, ASTContext &Cont)
static bool isOperandMentioned(unsigned OpNo, ArrayRef< GCCAsmStmt::AsmStringPiece > AsmStrPieces)
isOperandMentioned - Return true if the specified operand # is mentioned anywhere in the decomposed a...
static bool CheckAsmLValue(Expr *E, Sema &S)
CheckAsmLValue - GNU C has an extremely ugly extension whereby they silently ignore "noop" casts in p...
static StringRef extractRegisterName(const Expr *Expression, const TargetInfo &Target)
static bool CheckNakedParmReference(Expr *E, Sema &S)
static bool checkExprMemoryConstraintCompat(Sema &S, Expr *E, TargetInfo::ConstraintInfo &Info, bool is_input_expr)
Returns true if given expression is not compatible with inline assembly's memory constraint; false ot...
static void removeLValueToRValueCast(Expr *E)
Remove the upper-level LValueToRValue cast from an expression.
static void emitAndFixInvalidAsmCastLValue(const Expr *LVal, Expr *BadArgument, Sema &S)
Emit a warning about usage of "noop"-like casts for lvalues (GNU extension) and fix the argument with...
Defines the clang::TypeLoc interface and its subclasses.
bool toIntegralConstant(APSInt &Result, QualType SrcTy, const ASTContext &Ctx) const
Try to convert this value to an integral constant.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
Attr - This represents one attribute.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
Represents a C++ nested-name-specifier or a global scope specifier.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
SourceLocation getBegin() const
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
A reference to a declared variable, function, enum, etc.
SourceLocation getLocation() const
This represents one expression.
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, does not have an incomplet...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isEvaluatable(const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects) const
isEvaluatable - Call EvaluateAsRValue to see if this expression can be constant folded without side-e...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
bool refersToGlobalRegisterVar() const
Returns whether this expression refers to a global register variable.
Represents a member of a struct/union/class.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Represents a function declaration or definition.
AsmStringPiece - this is part of a decomposed asm string specification (for use with the AnalyzeAsmSt...
const std::string & getString() const
unsigned getOperandNo() const
CharSourceRange getRange() const
char getModifier() const
getModifier - Get the modifier for this operand, if present.
This represents a GCC inline-assembly statement extension.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Represents the declaration of a label.
Represents the results of name lookup.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
This represents a Microsoft inline-assembly statement extension.
This represents a decl that may have a name.
A C++ nested-name-specifier augmented with source location information.
PointerType - C99 6.7.5.1 - Pointer Declarators.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Sema - This implements semantic analysis and AST building for C.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
StmtResult ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, ArrayRef< Token > AsmToks, StringRef AsmString, unsigned NumOutputs, unsigned NumInputs, ArrayRef< StringRef > Constraints, ArrayRef< StringRef > Clobbers, ArrayRef< Expr * > Exprs, SourceLocation EndLoc)
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
void setFunctionHasBranchIntoScope()
ExprResult LookupInlineAsmIdentifier(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool IsUnevaluatedContext)
void CleanupVarDeclMarking()
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
void PopExpressionEvaluationContext()
const LangOptions & getLangOpts() const
bool RequireCompleteExprType(Expr *E, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type of the given expression is complete.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CCK_ImplicitConversion)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
DeclContext * getCurLexicalContext() const
SourceLocation getLocationOfStringLiteralByte(const StringLiteral *SL, unsigned ByteNo) const
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void FillInlineAsmIdentifierInfo(Expr *Res, llvm::InlineAsmIdentifierInfo &Info)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset, SourceLocation AsmLoc)
LabelDecl * LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc, SourceLocation GnuLabelLoc=SourceLocation())
LookupOrCreateLabel - Do a name lookup of a label with the specified name.
ExprResult LookupInlineAsmVarDeclField(Expr *RefExpr, StringRef Member, SourceLocation AsmLoc)
void setFunctionHasBranchProtectedScope()
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void DiscardCleanupsInEvaluationContext()
LabelDecl * GetOrCreateMSAsmLabel(StringRef ExternalLabelName, SourceLocation Location, bool AlwaysCreate)
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, Expr *AsmString, MultiExprArg Clobbers, unsigned NumLabels, SourceLocation RParenLoc)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getBeginLoc() const LLVM_READONLY
StringRef getString() const
Exposes information about the current target.
bool validateInputConstraint(MutableArrayRef< ConstraintInfo > OutputConstraints, ConstraintInfo &info) const
virtual bool validateOutputSize(const llvm::StringMap< bool > &FeatureMap, StringRef, unsigned) const
virtual bool validateInputSize(const llvm::StringMap< bool > &FeatureMap, StringRef, unsigned) const
virtual bool validateConstraintModifier(StringRef, char, unsigned, std::string &) const
bool validateOutputConstraint(ConstraintInfo &Info) const
bool isValidClobber(StringRef Name) const
Returns whether the passed in string is a valid clobber in an inline asm statement.
Represents a declaration of a type.
The base class of the type hierarchy.
bool isStructureType() const
bool isBooleanType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isMemberPointerType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isRealFloatingType() const
Floating point categories.
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
Represents a C++ unqualified-id that has been parsed.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
Defines the clang::TargetInfo interface.
@ C
Languages that the frontend can parse and compile.
@ Result
The result type of a method or function.
ActionResult< Expr * > ExprResult
CastKind
CastKind - The kind of operation required for a conversion.
ActionResult< CXXBaseSpecifier * > BaseResult
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool isGlobalLValue() const
const std::string & getConstraintStr() const
unsigned getTiedOperand() const
bool allowsMemory() const
bool isValidAsmImmediate(const llvm::APInt &Value) const
bool requiresImmediateConstant() const
bool hasTiedOperand() const
Return true if this input operand is a matching constraint that ties it to an output operand.
bool allowsRegister() const