1 //===- TypeSize.cpp - Wrapper around type sizes------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/Support/TypeSize.h" 10 #include "llvm/Support/CommandLine.h" 11 #include "llvm/Support/WithColor.h" 12 13 #include "DebugOptions.h" 14 15 using namespace llvm; 16 17 #ifndef STRICT_FIXED_SIZE_VECTORS 18 namespace { 19 struct CreateScalableErrorAsWarning { 20 /// The ScalableErrorAsWarning is a temporary measure to suppress errors from 21 /// using the wrong interface on a scalable vector. 22 static void *call() { 23 return new cl::opt<bool>( 24 "treat-scalable-fixed-error-as-warning", cl::Hidden, 25 cl::desc( 26 "Treat issues where a fixed-width property is requested from a " 27 "scalable type as a warning, instead of an error")); 28 } 29 }; 30 } // namespace 31 static ManagedStatic<cl::opt<bool>, CreateScalableErrorAsWarning> 32 ScalableErrorAsWarning; 33 void llvm::initTypeSizeOptions() { *ScalableErrorAsWarning; } 34 #else 35 void llvm::initTypeSizeOptions() {} 36 #endif 37 38 void llvm::reportInvalidSizeRequest(const char *Msg) { 39 #ifndef STRICT_FIXED_SIZE_VECTORS 40 if (*ScalableErrorAsWarning) { 41 WithColor::warning() << "Invalid size request on a scalable vector; " << Msg 42 << "\n"; 43 return; 44 } 45 #endif 46 report_fatal_error("Invalid size request on a scalable vector."); 47 } 48 49 TypeSize::operator TypeSize::ScalarTy() const { 50 if (isScalable()) { 51 reportInvalidSizeRequest( 52 "Cannot implicitly convert a scalable size to a fixed-width size in " 53 "`TypeSize::operator ScalarTy()`"); 54 return getKnownMinValue(); 55 } 56 return getFixedValue(); 57 } 58