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