Home | History | Annotate | Download | only in Analysis
      1 //===- TypeMetadataUtils.h - Utilities related to type metadata --*- C++ -*-==//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains functions that make it easier to manipulate type metadata
     11 // for devirtualization.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_ANALYSIS_TYPEMETADATAUTILS_H
     16 #define LLVM_ANALYSIS_TYPEMETADATAUTILS_H
     17 
     18 #include "llvm/ADT/SmallVector.h"
     19 #include "llvm/IR/CallSite.h"
     20 
     21 namespace llvm {
     22 
     23 /// The type of CFI jumptable needed for a function.
     24 enum CfiFunctionLinkage {
     25   CFL_Definition = 0,
     26   CFL_Declaration = 1,
     27   CFL_WeakDeclaration = 2
     28 };
     29 
     30 /// A call site that could be devirtualized.
     31 struct DevirtCallSite {
     32   /// The offset from the address point to the virtual function.
     33   uint64_t Offset;
     34   /// The call site itself.
     35   CallSite CS;
     36 };
     37 
     38 /// Given a call to the intrinsic @llvm.type.test, find all devirtualizable
     39 /// call sites based on the call and return them in DevirtCalls.
     40 void findDevirtualizableCallsForTypeTest(
     41     SmallVectorImpl<DevirtCallSite> &DevirtCalls,
     42     SmallVectorImpl<CallInst *> &Assumes, const CallInst *CI);
     43 
     44 /// Given a call to the intrinsic @llvm.type.checked.load, find all
     45 /// devirtualizable call sites based on the call and return them in DevirtCalls.
     46 void findDevirtualizableCallsForTypeCheckedLoad(
     47     SmallVectorImpl<DevirtCallSite> &DevirtCalls,
     48     SmallVectorImpl<Instruction *> &LoadedPtrs,
     49     SmallVectorImpl<Instruction *> &Preds, bool &HasNonCallUses,
     50     const CallInst *CI);
     51 }
     52 
     53 #endif
     54