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(reason: "Invalid size request on a scalable vector." ); |
47 | } |
48 | |
49 | TypeSize::operator TypeSize::ScalarTy() const { |
50 | if (isScalable()) { |
51 | reportInvalidSizeRequest( |
52 | Msg: "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 | |