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