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/ManagedStatic.h" 12 #include "llvm/Support/WithColor.h" 13 14 #include "DebugOptions.h" 15 16 using namespace llvm; 17 18 #ifndef STRICT_FIXED_SIZE_VECTORS 19 namespace { 20 struct CreateScalableErrorAsWarning { 21 /// The ScalableErrorAsWarning is a temporary measure to suppress errors from 22 /// using the wrong interface on a scalable vector. call__anon11b631390111::CreateScalableErrorAsWarning23 static void *call() { 24 return new cl::opt<bool>( 25 "treat-scalable-fixed-error-as-warning", cl::Hidden, 26 cl::desc( 27 "Treat issues where a fixed-width property is requested from a " 28 "scalable type as a warning, instead of an error")); 29 } 30 }; 31 } // namespace 32 static ManagedStatic<cl::opt<bool>, CreateScalableErrorAsWarning> 33 ScalableErrorAsWarning; initTypeSizeOptions()34void llvm::initTypeSizeOptions() { *ScalableErrorAsWarning; } 35 #else initTypeSizeOptions()36void llvm::initTypeSizeOptions() {} 37 #endif 38 reportInvalidSizeRequest(const char * Msg)39void llvm::reportInvalidSizeRequest(const char *Msg) { 40 #ifndef STRICT_FIXED_SIZE_VECTORS 41 if (*ScalableErrorAsWarning) { 42 WithColor::warning() << "Invalid size request on a scalable vector; " << Msg 43 << "\n"; 44 return; 45 } 46 #endif 47 report_fatal_error("Invalid size request on a scalable vector."); 48 } 49 operator TypeSize::ScalarTy() const50TypeSize::operator TypeSize::ScalarTy() const { 51 if (isScalable()) { 52 reportInvalidSizeRequest( 53 "Cannot implicitly convert a scalable size to a fixed-width size in " 54 "`TypeSize::operator ScalarTy()`"); 55 return getKnownMinValue(); 56 } 57 return getFixedValue(); 58 } 59