]> granicus.if.org Git - clang/commitdiff
Revert 374450 "Fix __builtin_assume_aligned with too large values."
authorNico Weber <nicolasweber@gmx.de>
Thu, 10 Oct 2019 21:34:32 +0000 (21:34 +0000)
committerNico Weber <nicolasweber@gmx.de>
Thu, 10 Oct 2019 21:34:32 +0000 (21:34 +0000)
The test fails on Windows, with

  error: 'warning' diagnostics expected but not seen:
    File builtin-assume-aligned.c Line 62: requested alignment
        must be 268435456 bytes or smaller; assumption ignored
  error: 'warning' diagnostics seen but not expected:
    File builtin-assume-aligned.c Line 62: requested alignment
        must be 8192 bytes or smaller; assumption ignored

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@374456 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/CodeGen/CGBuiltin.cpp
lib/CodeGen/CGCall.cpp
lib/CodeGen/CGExprScalar.cpp
lib/CodeGen/CGStmtOpenMP.cpp
lib/CodeGen/CodeGenFunction.cpp
lib/CodeGen/CodeGenFunction.h
lib/Sema/SemaChecking.cpp
test/Sema/builtin-assume-aligned.c

index 68f2b379507be1ac68dee09ed9ed7669940ae4be..bcd059be9113955fbd68fe484c93c168423613bd 100644 (file)
@@ -2853,10 +2853,6 @@ def err_alignment_dependent_typedef_name : Error<
 
 def err_attribute_aligned_too_great : Error<
   "requested alignment must be %0 bytes or smaller">;
-def warn_assume_aligned_too_great
-    : Warning<"requested alignment must be %0 bytes or smaller; assumption "
-              "ignored">,
-      InGroup<DiagGroup<"builtin-assume-aligned-alignment">>;
 def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning<
   "%q0 redeclared without %1 attribute: previous %1 ignored">,
   InGroup<MicrosoftInconsistentDllImport>;
index e6369d80cd73cb0f5a7c092fe943b81a8a943f16..0562a623ae2b3eff62f42bf1447d71a53f87e43e 100644 (file)
@@ -2048,10 +2048,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
 
     Value *AlignmentValue = EmitScalarExpr(E->getArg(1));
     ConstantInt *AlignmentCI = cast<ConstantInt>(AlignmentValue);
+    unsigned Alignment = (unsigned)AlignmentCI->getZExtValue();
 
     EmitAlignmentAssumption(PtrValue, Ptr,
                             /*The expr loc is sufficient.*/ SourceLocation(),
-                            AlignmentCI, OffsetValue);
+                            Alignment, OffsetValue);
     return RValue::get(PtrValue);
   }
   case Builtin::BI__assume:
index 2ec9e91e3154795e6069fce2e922f782d0ec3a87..682a7ccb493f515c9c575170e4becbc614aa6baf 100644 (file)
@@ -4569,7 +4569,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
       llvm::Value *Alignment = EmitScalarExpr(AA->getAlignment());
       llvm::ConstantInt *AlignmentCI = cast<llvm::ConstantInt>(Alignment);
       EmitAlignmentAssumption(Ret.getScalarVal(), RetTy, Loc, AA->getLocation(),
-                              AlignmentCI, OffsetValue);
+                              AlignmentCI->getZExtValue(), OffsetValue);
     } else if (const auto *AA = TargetDecl->getAttr<AllocAlignAttr>()) {
       llvm::Value *AlignmentVal = CallArgs[AA->getParamIndex().getLLVMIndex()]
                                       .getRValue(*this)
index c7f279d28e83168c488f3a45b504abfc154036f2..0b9271b1d31fc7ad21b8ed56884beb62d4ba24c2 100644 (file)
@@ -294,7 +294,8 @@ public:
 
     Value *AlignmentValue = CGF.EmitScalarExpr(AVAttr->getAlignment());
     llvm::ConstantInt *AlignmentCI = cast<llvm::ConstantInt>(AlignmentValue);
-    CGF.EmitAlignmentAssumption(V, E, AVAttr->getLocation(), AlignmentCI);
+    CGF.EmitAlignmentAssumption(V, E, AVAttr->getLocation(),
+                                AlignmentCI->getZExtValue());
   }
 
   /// EmitLoadOfLValue - Given an expression with complex type that represents a
index fa4304d7e5ca2497ed71113f18be85a142d63490..e50cdb1b678f837a8e2441f5966a09ea72d0be56 100644 (file)
@@ -1519,14 +1519,14 @@ static void emitAlignedClause(CodeGenFunction &CGF,
   if (!CGF.HaveInsertPoint())
     return;
   for (const auto *Clause : D.getClausesOfKind<OMPAlignedClause>()) {
-    size_t ClauseAlignment = 0;
+    unsigned ClauseAlignment = 0;
     if (const Expr *AlignmentExpr = Clause->getAlignment()) {
       auto *AlignmentCI =
           cast<llvm::ConstantInt>(CGF.EmitScalarExpr(AlignmentExpr));
-      ClauseAlignment = AlignmentCI->getZExtValue();
+      ClauseAlignment = static_cast<unsigned>(AlignmentCI->getZExtValue());
     }
     for (const Expr *E : Clause->varlists()) {
-      size_t Alignment = ClauseAlignment;
+      unsigned Alignment = ClauseAlignment;
       if (Alignment == 0) {
         // OpenMP [2.8.1, Description]
         // If no optional parameter is specified, implementation-defined default
@@ -1542,8 +1542,7 @@ static void emitAlignedClause(CodeGenFunction &CGF,
       if (Alignment != 0) {
         llvm::Value *PtrValue = CGF.EmitScalarExpr(E);
         CGF.EmitAlignmentAssumption(
-            PtrValue, E, /*No second loc needed*/ SourceLocation(),
-            llvm::ConstantInt::get(CGF.SizeTy, Alignment));
+            PtrValue, E, /*No second loc needed*/ SourceLocation(), Alignment);
       }
     }
   }
index 3f9a52ab7638aff79130ba7cd0f1277f70c2dd2f..41b7f2f4b1be9153e030fec64875f01d413615ba 100644 (file)
@@ -2056,10 +2056,25 @@ void CodeGenFunction::EmitAlignmentAssumption(llvm::Value *PtrValue,
   }
 }
 
+void CodeGenFunction::EmitAlignmentAssumption(llvm::Value *PtrValue,
+                                              QualType Ty, SourceLocation Loc,
+                                              SourceLocation AssumptionLoc,
+                                              unsigned Alignment,
+                                              llvm::Value *OffsetValue) {
+  llvm::Value *TheCheck;
+  llvm::Instruction *Assumption = Builder.CreateAlignmentAssumption(
+      CGM.getDataLayout(), PtrValue, Alignment, OffsetValue, &TheCheck);
+  if (SanOpts.has(SanitizerKind::Alignment)) {
+    llvm::Value *AlignmentVal = llvm::ConstantInt::get(IntPtrTy, Alignment);
+    EmitAlignmentAssumptionCheck(PtrValue, Ty, Loc, AssumptionLoc, AlignmentVal,
+                                 OffsetValue, TheCheck, Assumption);
+  }
+}
+
 void CodeGenFunction::EmitAlignmentAssumption(llvm::Value *PtrValue,
                                               const Expr *E,
                                               SourceLocation AssumptionLoc,
-                                              llvm::Value *Alignment,
+                                              unsigned Alignment,
                                               llvm::Value *OffsetValue) {
   if (auto *CE = dyn_cast<CastExpr>(E))
     E = CE->getSubExprAsWritten();
index bb4fed808373c7ac1f4139a08b70a47903d759a9..ea78309a06975d4e42becc53de57fd89cca9e185 100644 (file)
@@ -2829,8 +2829,13 @@ public:
                                llvm::Value *Alignment,
                                llvm::Value *OffsetValue = nullptr);
 
+  void EmitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty,
+                               SourceLocation Loc, SourceLocation AssumptionLoc,
+                               unsigned Alignment,
+                               llvm::Value *OffsetValue = nullptr);
+
   void EmitAlignmentAssumption(llvm::Value *PtrValue, const Expr *E,
-                               SourceLocation AssumptionLoc, llvm::Value *Alignment,
+                               SourceLocation AssumptionLoc, unsigned Alignment,
                                llvm::Value *OffsetValue = nullptr);
 
   //===--------------------------------------------------------------------===//
index b35d591a7f285acc224baacfea9df27a6c8ae2ff..07d3648dc9ac8c78607766c75d1a500e8b954cb6 100644 (file)
@@ -6063,16 +6063,6 @@ bool Sema::SemaBuiltinAssumeAligned(CallExpr *TheCall) {
     if (!Result.isPowerOf2())
       return Diag(TheCall->getBeginLoc(), diag::err_alignment_not_power_of_two)
              << Arg->getSourceRange();
-
-    // FIXME: this should probably use llvm::Value::MaximumAlignment, however
-    // doing so results in a linking issue in GCC in a couple of assemblies.
-    // Alignment calculations can wrap around if it's greater than 2**28.
-    unsigned MaximumAlignment =
-        Context.getTargetInfo().getTriple().isOSBinFormatCOFF() ? 8192
-                                                                : 268435456;
-    if (Result > MaximumAlignment)
-      Diag(TheCall->getBeginLoc(), diag::warn_assume_aligned_too_great)
-          << Arg->getSourceRange() << MaximumAlignment;
   }
 
   if (NumArgs > 2) {
index a669ed172de8072f4ae2040c1d3ee7c62c977a0e..057a500b321afa913531687344c301d9a4796606 100644 (file)
@@ -58,7 +58,3 @@ void *test_no_fn_proto() __attribute__((assume_aligned)); // expected-error {{'a
 void *test_no_fn_proto() __attribute__((assume_aligned())); // expected-error {{'assume_aligned' attribute takes at least 1 argument}}
 void *test_no_fn_proto() __attribute__((assume_aligned(32, 45, 37))); // expected-error {{'assume_aligned' attribute takes no more than 2 arguments}}
 
-int pr43638(int *a) {
-  a = __builtin_assume_aligned(a, 4294967296); // expected-warning {{requested alignment must be 268435456 bytes or smaller; assumption ignored}}
-return a[0];
-}