Home | History | Annotate | Line # | Download | only in Analysis
      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 
     23 inline const char *getRVMarkerModuleFlagStr() {
     24   return "clang.arc.retainAutoreleasedReturnValueMarker";
     25 }
     26 
     27 enum AttachedCallOperandBundle : unsigned { RVOB_Retain, RVOB_Claim };
     28 
     29 inline AttachedCallOperandBundle
     30 getAttachedCallOperandBundleEnum(bool IsRetain) {
     31   return IsRetain ? RVOB_Retain : RVOB_Claim;
     32 }
     33 
     34 inline 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 
     42 inline 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