1 //===- ObjCARCUtil.h - ObjC ARC Utility Functions ---------------*- C++ -*-===// 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 /// \file 9 /// This file defines ARC utility functions which are used by various parts of 10 /// the compiler. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_IR_OBJCARCUTIL_H 15 #define LLVM_IR_OBJCARCUTIL_H 16 17 #include "llvm/IR/InstrTypes.h" 18 #include "llvm/IR/LLVMContext.h" 19 20 namespace llvm { 21 namespace objcarc { 22 getRVMarkerModuleFlagStr()23inline const char *getRVMarkerModuleFlagStr() { 24 return "clang.arc.retainAutoreleasedReturnValueMarker"; 25 } 26 27 enum AttachedCallOperandBundle : unsigned { RVOB_Retain, RVOB_Claim }; 28 29 inline AttachedCallOperandBundle getAttachedCallOperandBundleEnum(bool IsRetain)30getAttachedCallOperandBundleEnum(bool IsRetain) { 31 return IsRetain ? RVOB_Retain : RVOB_Claim; 32 } 33 hasAttachedCallOpBundle(const CallBase * CB,bool IsRetain)34inline bool hasAttachedCallOpBundle(const CallBase *CB, bool IsRetain) { 35 auto B = CB->getOperandBundle(LLVMContext::OB_clang_arc_attachedcall); 36 if (!B.hasValue()) 37 return false; 38 return cast<ConstantInt>(B->Inputs[0])->getZExtValue() == 39 getAttachedCallOperandBundleEnum(IsRetain); 40 } 41 hasAttachedCallOpBundle(const CallBase * CB)42inline bool hasAttachedCallOpBundle(const CallBase *CB) { 43 return CB->getOperandBundle(LLVMContext::OB_clang_arc_attachedcall) 44 .hasValue(); 45 } 46 47 } // end namespace objcarc 48 } // end namespace llvm 49 50 #endif 51