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
15using namespace llvm;
16
17#ifndef STRICT_FIXED_SIZE_VECTORS
18namespace {
19struct 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
31static ManagedStatic<cl::opt<bool>, CreateScalableErrorAsWarning>
32 ScalableErrorAsWarning;
33void llvm::initTypeSizeOptions() { *ScalableErrorAsWarning; }
34#else
35void llvm::initTypeSizeOptions() {}
36#endif
37
38void 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
49TypeSize::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

source code of llvm/lib/Support/TypeSize.cpp