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}
57LLVM_ATTRIBUTE_UNUSED static bool isCommonLinkage(GlobalLinkageKind linkage) {
58 return linkage == GlobalLinkageKind::CommonLinkage;
59}
60LLVM_ATTRIBUTE_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.
68LLVM_ATTRIBUTE_UNUSED static bool
69isInterposableLinkage(GlobalLinkageKind linkage) {
70 switch (linkage) {
71 case GlobalLinkageKind::WeakAnyLinkage:
72 case GlobalLinkageKind::LinkOnceAnyLinkage:
73 case GlobalLinkageKind::CommonLinkage:
74 case GlobalLinkageKind::ExternalWeakLinkage:
75 return true;
76
77 case GlobalLinkageKind::AvailableExternallyLinkage:
78 case GlobalLinkageKind::LinkOnceODRLinkage:
79 case GlobalLinkageKind::WeakODRLinkage:
80 // The above three cannot be overridden but can be de-refined.
81
82 case GlobalLinkageKind::ExternalLinkage:
83 case GlobalLinkageKind::InternalLinkage:
84 case GlobalLinkageKind::PrivateLinkage:
85 return false;
86 }
87 llvm_unreachable("Fully covered switch above!");
88}
89
90/// Whether the definition of this global may be discarded if it is not used
91/// in its compilation unit.
92LLVM_ATTRIBUTE_UNUSED static bool
93isDiscardableIfUnused(GlobalLinkageKind linkage) {
94 return isLinkOnceLinkage(linkage) || isLocalLinkage(linkage) ||
96}
97
98/// Whether the definition of this global may be replaced at link time. NB:
99/// Using this method outside of the code generators is almost always a
100/// mistake: when working at the IR level use isInterposable instead as it
101/// knows about ODR semantics.
102LLVM_ATTRIBUTE_UNUSED static bool isWeakForLinker(GlobalLinkageKind linkage) {
103 return linkage == GlobalLinkageKind::WeakAnyLinkage ||
104 linkage == GlobalLinkageKind::WeakODRLinkage ||
105 linkage == GlobalLinkageKind::LinkOnceAnyLinkage ||
106 linkage == GlobalLinkageKind::LinkOnceODRLinkage ||
107 linkage == GlobalLinkageKind::CommonLinkage ||
108 linkage == GlobalLinkageKind::ExternalWeakLinkage;
109}
110
111LLVM_ATTRIBUTE_UNUSED static bool isValidLinkage(GlobalLinkageKind gl) {
112 return isExternalLinkage(gl) || isLocalLinkage(gl) || isWeakLinkage(gl) ||
114}
115
116bool operator<(cir::MemOrder, cir::MemOrder) = delete;
117bool operator>(cir::MemOrder, cir::MemOrder) = delete;
118bool operator<=(cir::MemOrder, cir::MemOrder) = delete;
119bool operator>=(cir::MemOrder, cir::MemOrder) = delete;
120
121// Validate an integral value which isn't known to fit within the enum's range
122// is a valid AtomicOrderingCABI.
123template <typename Int> inline bool isValidCIRAtomicOrderingCABI(Int value) {
124 return static_cast<Int>(cir::MemOrder::Relaxed) <= value &&
125 value <= static_cast<Int>(cir::MemOrder::SequentiallyConsistent);
126}
127
128} // namespace cir
129
130#endif // CLANG_CIR_DIALECT_IR_CIROPSENUMS_H
Definition: ABIArgInfo.h:22
static bool isLocalLinkage(GlobalLinkageKind linkage)
Definition: CIROpsEnums.h:51
static LLVM_ATTRIBUTE_UNUSED 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:93
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
bool isValidCIRAtomicOrderingCABI(Int value)
Definition: CIROpsEnums.h:123
static LLVM_ATTRIBUTE_UNUSED bool isValidDeclarationLinkage(GlobalLinkageKind linkage)
Definition: CIROpsEnums.h:61
static bool isWeakODRLinkage(GlobalLinkageKind linkage)
Definition: CIROpsEnums.h:39
static bool isLinkOnceAnyLinkage(GlobalLinkageKind linkage)
Definition: CIROpsEnums.h:27
static LLVM_ATTRIBUTE_UNUSED bool isValidLinkage(GlobalLinkageKind gl)
Definition: CIROpsEnums.h:111
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 LLVM_ATTRIBUTE_UNUSED bool isInterposableLinkage(GlobalLinkageKind linkage)
Whether the definition of this global may be replaced by something non-equivalent at link time.
Definition: CIROpsEnums.h:69
static bool isWeakAnyLinkage(GlobalLinkageKind linkage)
Definition: CIROpsEnums.h:36
bool operator<(cir::MemOrder, cir::MemOrder)=delete
static LLVM_ATTRIBUTE_UNUSED bool isWeakForLinker(GlobalLinkageKind linkage)
Whether the definition of this global may be replaced at link time.
Definition: CIROpsEnums.h:102
static LLVM_ATTRIBUTE_UNUSED bool isCommonLinkage(GlobalLinkageKind linkage)
Definition: CIROpsEnums.h:57
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