xref: /llvm-project/llvm/lib/Support/ModRef.cpp (revision 22e9024c9f374c0c740647829050c289673dbb11)
10cff3e85SRahul Joshi //===--- ModRef.cpp - Memory effect modeling --------------------*- C++ -*-===//
20cff3e85SRahul Joshi //
30cff3e85SRahul Joshi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40cff3e85SRahul Joshi // See https://llvm.org/LICENSE.txt for license information.
50cff3e85SRahul Joshi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60cff3e85SRahul Joshi //
70cff3e85SRahul Joshi //===----------------------------------------------------------------------===//
80cff3e85SRahul Joshi //
90cff3e85SRahul Joshi //  This file implements ModRef and MemoryEffects misc functions.
100cff3e85SRahul Joshi //
110cff3e85SRahul Joshi //===----------------------------------------------------------------------===//
120cff3e85SRahul Joshi 
130cff3e85SRahul Joshi #include "llvm/Support/ModRef.h"
14115b8763SRahul Joshi #include "llvm/ADT/STLExtras.h"
15*22e9024cSNikita Popov #include "llvm/ADT/StringExtras.h"
160cff3e85SRahul Joshi 
170cff3e85SRahul Joshi using namespace llvm;
180cff3e85SRahul Joshi 
190cff3e85SRahul Joshi raw_ostream &llvm::operator<<(raw_ostream &OS, ModRefInfo MR) {
200cff3e85SRahul Joshi   switch (MR) {
210cff3e85SRahul Joshi   case ModRefInfo::NoModRef:
220cff3e85SRahul Joshi     OS << "NoModRef";
230cff3e85SRahul Joshi     break;
240cff3e85SRahul Joshi   case ModRefInfo::Ref:
250cff3e85SRahul Joshi     OS << "Ref";
260cff3e85SRahul Joshi     break;
270cff3e85SRahul Joshi   case ModRefInfo::Mod:
280cff3e85SRahul Joshi     OS << "Mod";
290cff3e85SRahul Joshi     break;
300cff3e85SRahul Joshi   case ModRefInfo::ModRef:
310cff3e85SRahul Joshi     OS << "ModRef";
320cff3e85SRahul Joshi     break;
330cff3e85SRahul Joshi   }
340cff3e85SRahul Joshi   return OS;
350cff3e85SRahul Joshi }
360cff3e85SRahul Joshi 
370cff3e85SRahul Joshi raw_ostream &llvm::operator<<(raw_ostream &OS, MemoryEffects ME) {
38115b8763SRahul Joshi   interleaveComma(MemoryEffects::locations(), OS, [&](IRMemLocation Loc) {
390cff3e85SRahul Joshi     switch (Loc) {
400cff3e85SRahul Joshi     case IRMemLocation::ArgMem:
410cff3e85SRahul Joshi       OS << "ArgMem: ";
420cff3e85SRahul Joshi       break;
430cff3e85SRahul Joshi     case IRMemLocation::InaccessibleMem:
440cff3e85SRahul Joshi       OS << "InaccessibleMem: ";
450cff3e85SRahul Joshi       break;
460cff3e85SRahul Joshi     case IRMemLocation::Other:
470cff3e85SRahul Joshi       OS << "Other: ";
480cff3e85SRahul Joshi       break;
490cff3e85SRahul Joshi     }
50115b8763SRahul Joshi     OS << ME.getModRef(Loc);
51115b8763SRahul Joshi   });
520cff3e85SRahul Joshi   return OS;
530cff3e85SRahul Joshi }
54*22e9024cSNikita Popov 
55*22e9024cSNikita Popov raw_ostream &llvm::operator<<(raw_ostream &OS, CaptureComponents CC) {
56*22e9024cSNikita Popov   if (capturesNothing(CC)) {
57*22e9024cSNikita Popov     OS << "none";
58*22e9024cSNikita Popov     return OS;
59*22e9024cSNikita Popov   }
60*22e9024cSNikita Popov 
61*22e9024cSNikita Popov   ListSeparator LS;
62*22e9024cSNikita Popov   if (capturesAddressIsNullOnly(CC))
63*22e9024cSNikita Popov     OS << LS << "address_is_null";
64*22e9024cSNikita Popov   else if (capturesAddress(CC))
65*22e9024cSNikita Popov     OS << LS << "address";
66*22e9024cSNikita Popov   if (capturesReadProvenanceOnly(CC))
67*22e9024cSNikita Popov     OS << LS << "read_provenance";
68*22e9024cSNikita Popov   if (capturesFullProvenance(CC))
69*22e9024cSNikita Popov     OS << LS << "provenance";
70*22e9024cSNikita Popov 
71*22e9024cSNikita Popov   return OS;
72*22e9024cSNikita Popov }
73*22e9024cSNikita Popov 
74*22e9024cSNikita Popov raw_ostream &llvm::operator<<(raw_ostream &OS, CaptureInfo CI) {
75*22e9024cSNikita Popov   ListSeparator LS;
76*22e9024cSNikita Popov   CaptureComponents Other = CI.getOtherComponents();
77*22e9024cSNikita Popov   CaptureComponents Ret = CI.getRetComponents();
78*22e9024cSNikita Popov 
79*22e9024cSNikita Popov   OS << "captures(";
80*22e9024cSNikita Popov   if (!capturesNothing(Other) || Other == Ret)
81*22e9024cSNikita Popov     OS << LS << Other;
82*22e9024cSNikita Popov   if (Other != Ret)
83*22e9024cSNikita Popov     OS << LS << "ret: " << Ret;
84*22e9024cSNikita Popov   OS << ")";
85*22e9024cSNikita Popov   return OS;
86*22e9024cSNikita Popov }
87