parent
164df7debd
commit
d75987dde9
|
@ -5146,9 +5146,6 @@ let CategoryName = "Inline Assembly Issue" in {
|
|||
"invalid use of a cast in a inline asm context requiring an l-value: "
|
||||
"accepted due to -fheinous-gnu-extensions, but clang may remove support "
|
||||
"for this in the future">;
|
||||
def warn_mismatched_size_modifier : Warning<
|
||||
"the size being stored may not be the size intended, use a modifier to "
|
||||
"specify the size">;
|
||||
|
||||
def err_inline_ms_asm_parsing : Error<"%0">;
|
||||
}
|
||||
|
|
|
@ -517,11 +517,6 @@ public:
|
|||
bool validateInputConstraint(ConstraintInfo *OutputConstraints,
|
||||
unsigned NumOutputs,
|
||||
ConstraintInfo &info) const;
|
||||
virtual bool validateConstraintModifier(StringRef /*Constraint*/,
|
||||
const char /*Modifier*/,
|
||||
unsigned /*Size*/) const {
|
||||
return true;
|
||||
}
|
||||
bool resolveSymbolicName(const char *&Name,
|
||||
ConstraintInfo *OutputConstraints,
|
||||
unsigned NumOutputs, unsigned &Index) const;
|
||||
|
|
|
@ -3315,29 +3315,6 @@ public:
|
|||
}
|
||||
return R;
|
||||
}
|
||||
virtual bool validateConstraintModifier(StringRef Constraint,
|
||||
const char Modifier,
|
||||
unsigned Size) const {
|
||||
// Strip off constraint modifiers.
|
||||
while (Constraint[0] == '=' ||
|
||||
Constraint[0] == '+' ||
|
||||
Constraint[0] == '&')
|
||||
Constraint = Constraint.substr(1);
|
||||
|
||||
switch (Constraint[0]) {
|
||||
default: break;
|
||||
case 'r': {
|
||||
switch (Modifier) {
|
||||
default: return Size == 32;
|
||||
case 'q':
|
||||
// A register of size 32 cannot fit a vector type.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
virtual const char *getClobbers() const {
|
||||
// FIXME: Is this really right?
|
||||
return "";
|
||||
|
|
|
@ -208,54 +208,6 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
|
|||
return StmtError();
|
||||
}
|
||||
|
||||
// Validate constraints and modifiers.
|
||||
for (unsigned i = 0, e = Pieces.size(); i != e; ++i) {
|
||||
GCCAsmStmt::AsmStringPiece &Piece = Pieces[i];
|
||||
if (!Piece.isOperand()) continue;
|
||||
|
||||
// Look for the correct constraint index.
|
||||
unsigned Idx = 0;
|
||||
unsigned ConstraintIdx = 0;
|
||||
for (unsigned i = 0, e = NS->getNumOutputs(); i != e; ++i, ++ConstraintIdx) {
|
||||
TargetInfo::ConstraintInfo &Info = OutputConstraintInfos[i];
|
||||
if (Idx == Piece.getOperandNo())
|
||||
break;
|
||||
++Idx;
|
||||
|
||||
if (Info.isReadWrite()) {
|
||||
if (Idx == Piece.getOperandNo())
|
||||
break;
|
||||
++Idx;
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0, e = NS->getNumInputs(); i != e; ++i, ++ConstraintIdx) {
|
||||
TargetInfo::ConstraintInfo &Info = InputConstraintInfos[i];
|
||||
if (Idx == Piece.getOperandNo())
|
||||
break;
|
||||
++Idx;
|
||||
|
||||
if (Info.isReadWrite()) {
|
||||
if (Idx == Piece.getOperandNo())
|
||||
break;
|
||||
++Idx;
|
||||
}
|
||||
}
|
||||
|
||||
// Now that we have the right indexes go ahead and check.
|
||||
StringLiteral *Literal = Constraints[ConstraintIdx];
|
||||
const Type *Ty = Exprs[ConstraintIdx]->getType().getTypePtr();
|
||||
if (Ty->isDependentType() || Ty->isIncompleteType())
|
||||
continue;
|
||||
|
||||
unsigned Size = Context.getTypeSize(Ty);
|
||||
if (!Context.getTargetInfo()
|
||||
.validateConstraintModifier(Literal->getString(),
|
||||
Piece.getModifier(), Size))
|
||||
Diag(Exprs[ConstraintIdx]->getLocStart(),
|
||||
diag::warn_mismatched_size_modifier);
|
||||
}
|
||||
|
||||
// Validate tied input operands for type mismatches.
|
||||
for (unsigned i = 0, e = InputConstraintInfos.size(); i != e; ++i) {
|
||||
TargetInfo::ConstraintInfo &Info = InputConstraintInfos[i];
|
||||
|
|
|
@ -18,7 +18,7 @@ This test serves two purposes:
|
|||
|
||||
The list of warnings below should NEVER grow. It should gradually shrink to 0.
|
||||
|
||||
CHECK: Warnings without flags (155):
|
||||
CHECK: Warnings without flags (154):
|
||||
CHECK-NEXT: ext_delete_void_ptr_operand
|
||||
CHECK-NEXT: ext_enum_friend
|
||||
CHECK-NEXT: ext_expected_semi_decl_list
|
||||
|
@ -100,7 +100,6 @@ CHECK-NEXT: warn_many_braces_around_scalar_init
|
|||
CHECK-NEXT: warn_maynot_respond
|
||||
CHECK-NEXT: warn_method_param_redefinition
|
||||
CHECK-NEXT: warn_mismatched_exception_spec
|
||||
CHECK-NEXT: warn_mismatched_size_modifier
|
||||
CHECK-NEXT: warn_missing_case_for_condition
|
||||
CHECK-NEXT: warn_missing_dependent_template_keyword
|
||||
CHECK-NEXT: warn_missing_exception_specification
|
||||
|
|
Loading…
Reference in New Issue