Author: Erich Keane Date: 2020-05-14T07:21:09-07:00 New Revision: 5f1f4a5d0157c11e0a88d9a273f49c8f866b01ef
URL: https://github.com/llvm/llvm-project/commit/5f1f4a5d0157c11e0a88d9a273f49c8f866b01ef DIFF: https://github.com/llvm/llvm-project/commit/5f1f4a5d0157c11e0a88d9a273f49c8f866b01ef.diff LOG: Prohibit capture of _ExtInt in inline assembly. The backends don't seem to properly handle the _ExtInt type in inline assembly with crashes occurring in many. While the ones I tested seem to work for powers of 2 < 64 (and some any multiple of 64 greater than that), it seemed like a better idea to just use of this type in inline assembly prohibited. Added: Modified: clang/include/clang/Basic/DiagnosticCommonKinds.td clang/lib/Sema/SemaStmtAsm.cpp clang/test/SemaCXX/ext-int.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td index 5d8c939283b5..73f55784234e 100644 --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -240,6 +240,9 @@ let CategoryName = "Inline Assembly Issue" in { def err_asm_invalid_type_in_input : Error< "invalid type %0 in asm input for constraint '%1'">; + def err_asm_invalid_type : Error< + "invalid type %0 in asm %select{input|output}1">; + def warn_stack_clash_protection_inline_asm : Warning< "Unable to protect inline asm that clobbers stack pointer against stack clash">, InGroup<DiagGroup<"stack-protector">>; diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index 82a308f35c21..10fa24682f9c 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -296,6 +296,14 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, checkExprMemoryConstraintCompat(*this, OutputExpr, Info, false)) return StmtError(); + // Disallow _ExtInt, since the backends tend to have diff iculties with + // non-normal sizes. + if (OutputExpr->getType()->isExtIntType()) + return StmtError( + Diag(OutputExpr->getBeginLoc(), diag::err_asm_invalid_type) + << OutputExpr->getType() << 0 /*Input*/ + << OutputExpr->getSourceRange()); + OutputConstraintInfos.push_back(Info); // If this is dependent, just continue. @@ -420,6 +428,12 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, } } + if (InputExpr->getType()->isExtIntType()) + return StmtError( + Diag(InputExpr->getBeginLoc(), diag::err_asm_invalid_type) + << InputExpr->getType() << 1 /*Output*/ + << InputExpr->getSourceRange()); + InputConstraintInfos.push_back(Info); const Type *Ty = Exprs[i]->getType().getTypePtr(); @@ -892,6 +906,15 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, SourceLocation EndLoc) { bool IsSimple = (NumOutputs != 0 || NumInputs != 0); setFunctionHasBranchProtectedScope(); + + for (uint64_t I = 0; I < NumOutputs + NumInputs; ++I) { + if (Exprs[I]->getType()->isExtIntType()) + return StmtError( + Diag(Exprs[I]->getBeginLoc(), diag::err_asm_invalid_type) + << Exprs[I]->getType() << (I < NumOutputs) + << Exprs[I]->getSourceRange()); + } + MSAsmStmt *NS = new (Context) MSAsmStmt(Context, AsmLoc, LBraceLoc, IsSimple, /*IsVolatile*/ true, AsmToks, NumOutputs, NumInputs, diff --git a/clang/test/SemaCXX/ext-int.cpp b/clang/test/SemaCXX/ext-int.cpp index cf94fd17162a..a5e87eb878d3 100644 --- a/clang/test/SemaCXX/ext-int.cpp +++ b/clang/test/SemaCXX/ext-int.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s -Wimplicit-int-conversion -triple x86_64-gnu-linux +// RUN: %clang_cc1 -fsyntax-only -verify %s -Wimplicit-int-conversion -triple x86_64-gnu-linux -fasm-blocks template<int Bounds> struct HasExtInt { @@ -276,3 +276,12 @@ void ImplicitCasts(_ExtInt(31) s31, _ExtInt(33) s33, int i) { i = s33; } + +void NotAllowedInInlineAsm(_ExtInt(9) in, _ExtInt(9) out) { + __asm { mov eax, in} // expected-error{{invalid type '_ExtInt(9)' in asm input}} + __asm { mov out, eax} // expected-error{{invalid type '_ExtInt(9)' in asm output}} + + asm("" : "=g" (in));// expected-error{{invalid type '_ExtInt(9)' in asm input}} + asm("" :: "r" (out));// expected-error{{invalid type '_ExtInt(9)' in asm output}} + +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits