clang 22.0.0git
CIROpsEnums.h
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
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// This file declares the CIR enumerations.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef CLANG_CIR_DIALECT_IR_CIROPSENUMS_H
14#define CLANG_CIR_DIALECT_IR_CIROPSENUMS_H
15
16#include "mlir/IR/BuiltinAttributes.h"
17#include "clang/CIR/Dialect/IR/CIROpsEnums.h.inc"
18
19namespace cir {
20
21static bool isExternalLinkage(GlobalLinkageKind linkage) {
22 return linkage == GlobalLinkageKind::ExternalLinkage;
23}
24static bool isAvailableExternallyLinkage(GlobalLinkageKind linkage) {
25 return linkage == GlobalLinkageKind::AvailableExternallyLinkage;
26}
27static bool isLinkOnceAnyLinkage(GlobalLinkageKind linkage) {
28 return linkage == GlobalLinkageKind::LinkOnceAnyLinkage;
29}
30static bool isLinkOnceODRLinkage(GlobalLinkageKind linkage) {
31 return linkage == GlobalLinkageKind::LinkOnceODRLinkage;
32}
33static bool isLinkOnceLinkage(GlobalLinkageKind linkage) {
34 return isLinkOnceAnyLinkage(linkage) || isLinkOnceODRLinkage(linkage);
35}
36static bool isWeakAnyLinkage(GlobalLinkageKind linkage) {
37 return linkage == GlobalLinkageKind::WeakAnyLinkage;
38}
39static bool isWeakODRLinkage(GlobalLinkageKind linkage) {
40 return linkage == GlobalLinkageKind::WeakODRLinkage;
41}
42static bool isWeakLinkage(GlobalLinkageKind linkage) {
43 return isWeakAnyLinkage(linkage) || isWeakODRLinkage(linkage);
44}
45static bool isInternalLinkage(GlobalLinkageKind linkage) {
46 return linkage == GlobalLinkageKind::InternalLinkage;
47}
48static bool isPrivateLinkage(GlobalLinkageKind linkage) {
49 return linkage == GlobalLinkageKind::PrivateLinkage;
50}
51static bool isLocalLinkage(GlobalLinkageKind linkage) {
52 return isInternalLinkage(linkage) || isPrivateLinkage(linkage);
53}
54static bool isExternalWeakLinkage(GlobalLinkageKind linkage) {
55 return linkage == GlobalLinkageKind::ExternalWeakLinkage;
56}
57[[maybe_unused]] static bool isCommonLinkage(GlobalLinkageKind linkage) {
58 return linkage == GlobalLinkageKind::CommonLinkage;
59}
60[[maybe_unused]] static bool
61isValidDeclarationLinkage(GlobalLinkageKind linkage) {
62 return isExternalWeakLinkage(linkage) || isExternalLinkage(linkage);
63}
64
65/// Whether the definition of this global may be replaced by something
66/// non-equivalent at link time. For example, if a function has weak linkage
67/// then the code defining it may be replaced by different code.
68[[maybe_unused]] static bool isInterposableLinkage(GlobalLinkageKind linkage) {
69 switch (linkage) {
70 case GlobalLinkageKind::WeakAnyLinkage:
71 case GlobalLinkageKind::LinkOnceAnyLinkage:
72 case GlobalLinkageKind::CommonLinkage:
73 case GlobalLinkageKind::ExternalWeakLinkage:
74 return true;
75
76 case GlobalLinkageKind::AvailableExternallyLinkage:
77 case GlobalLinkageKind::LinkOnceODRLinkage:
78 case GlobalLinkageKind::WeakODRLinkage:
79 // The above three cannot be overridden but can be de-refined.
80
81 case GlobalLinkageKind::ExternalLinkage:
82 case GlobalLinkageKind::InternalLinkage:
83 case GlobalLinkageKind::PrivateLinkage:
84 return false;
85 }
86 llvm_unreachable("Fully covered switch above!");
87}
88
89/// Whether the definition of this global may be discarded if it is not used
90/// in its compilation unit.
91[[maybe_unused]] static bool isDiscardableIfUnused(GlobalLinkageKind linkage) {
92 return isLinkOnceLinkage(linkage) || isLocalLinkage(linkage) ||
94}
95
96/// Whether the definition of this global may be replaced at link time. NB:
97/// Using this method outside of the code generators is almost always a
98/// mistake: when working at the IR level use isInterposable instead as it
99/// knows about ODR semantics.
100[[maybe_unused]] static bool isWeakForLinker(GlobalLinkageKind linkage) {
101 return linkage == GlobalLinkageKind::WeakAnyLinkage ||
102 linkage == GlobalLinkageKind::WeakODRLinkage ||
103 linkage == GlobalLinkageKind::LinkOnceAnyLinkage ||
104 linkage == GlobalLinkageKind::LinkOnceODRLinkage ||
105 linkage == GlobalLinkageKind::CommonLinkage ||
106 linkage == GlobalLinkageKind::ExternalWeakLinkage;
107}
108
109[[maybe_unused]] static bool isValidLinkage(GlobalLinkageKind gl) {
110 return isExternalLinkage(gl) || isLocalLinkage(gl) || isWeakLinkage(gl) ||
112}
113
114bool operator<(cir::MemOrder, cir::MemOrder) = delete;
115bool operator>(cir::MemOrder, cir::MemOrder) = delete;
116bool operator<=(cir::MemOrder, cir::MemOrder) = delete;
117bool operator>=(cir::MemOrder, cir::MemOrder) = delete;
118
119// Validate an integral value which isn't known to fit within the enum's range
120// is a valid AtomicOrderingCABI.
121template <typename Int> inline bool isValidCIRAtomicOrderingCABI(Int value) {
122 return static_cast<Int>(cir::MemOrder::Relaxed) <= value &&
123 value <= static_cast<Int>(cir::MemOrder::SequentiallyConsistent);
124}
125
126} // namespace cir
127
128#endif // CLANG_CIR_DIALECT_IR_CIROPSENUMS_H
static bool isCommonLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:57
static bool isLocalLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:51
static bool isInterposableLinkage(GlobalLinkageKind linkage)
Whether the definition of this global may be replaced by something non-equivalent at link time.
Definition CIROpsEnums.h:68
bool operator<=(cir::MemOrder, cir::MemOrder)=delete
static bool isAvailableExternallyLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:24
static bool isLinkOnceODRLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:30
static bool isValidLinkage(GlobalLinkageKind gl)
bool isValidCIRAtomicOrderingCABI(Int value)
static bool isWeakODRLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:39
static bool isLinkOnceAnyLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:27
static bool isExternalLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:21
static bool isExternalWeakLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:54
static bool isLinkOnceLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:33
static bool isWeakLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:42
static bool isWeakForLinker(GlobalLinkageKind linkage)
Whether the definition of this global may be replaced at link time.
static bool isDiscardableIfUnused(GlobalLinkageKind linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
Definition CIROpsEnums.h:91
static bool isWeakAnyLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:36
bool operator<(cir::MemOrder, cir::MemOrder)=delete
static bool isInternalLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:45
bool operator>(cir::MemOrder, cir::MemOrder)=delete
bool operator>=(cir::MemOrder, cir::MemOrder)=delete
static bool isPrivateLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:48
static bool isValidDeclarationLinkage(GlobalLinkageKind linkage)
Definition CIROpsEnums.h:61