mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
0b8c9a80f2
into their new header subdirectory: include/llvm/IR. This matches the directory structure of lib, and begins to correct a long standing point of file layout clutter in LLVM. There are still more header files to move here, but I wanted to handle them in separate commits to make tracking what files make sense at each layer easier. The only really questionable files here are the target intrinsic tablegen files. But that's a battle I'd rather not fight today. I've updated both CMake and Makefile build systems (I think, and my tests think, but I may have missed something). I've also re-sorted the includes throughout the project. I'll be committing updates to Clang, DragonEgg, and Polly momentarily. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171366 91177308-0d34-0410-b5e6-96231b3b80d8
64 lines
2.7 KiB
C++
64 lines
2.7 KiB
C++
//===----- llvm/Analysis/CaptureTracking.h - Pointer capture ----*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains routines that help determine which pointers are captured.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ANALYSIS_CAPTURETRACKING_H
|
|
#define LLVM_ANALYSIS_CAPTURETRACKING_H
|
|
|
|
#include "llvm/Analysis/AliasAnalysis.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include "llvm/IR/Instructions.h"
|
|
#include "llvm/Support/CallSite.h"
|
|
|
|
namespace llvm {
|
|
/// PointerMayBeCaptured - Return true if this pointer value may be captured
|
|
/// by the enclosing function (which is required to exist). This routine can
|
|
/// be expensive, so consider caching the results. The boolean ReturnCaptures
|
|
/// specifies whether returning the value (or part of it) from the function
|
|
/// counts as capturing it or not. The boolean StoreCaptures specified
|
|
/// whether storing the value (or part of it) into memory anywhere
|
|
/// automatically counts as capturing it or not.
|
|
bool PointerMayBeCaptured(const Value *V,
|
|
bool ReturnCaptures,
|
|
bool StoreCaptures);
|
|
|
|
/// This callback is used in conjunction with PointerMayBeCaptured. In
|
|
/// addition to the interface here, you'll need to provide your own getters
|
|
/// to see whether anything was captured.
|
|
struct CaptureTracker {
|
|
virtual ~CaptureTracker();
|
|
|
|
/// tooManyUses - The depth of traversal has breached a limit. There may be
|
|
/// capturing instructions that will not be passed into captured().
|
|
virtual void tooManyUses() = 0;
|
|
|
|
/// shouldExplore - This is the use of a value derived from the pointer.
|
|
/// To prune the search (ie., assume that none of its users could possibly
|
|
/// capture) return false. To search it, return true.
|
|
///
|
|
/// U->getUser() is always an Instruction.
|
|
virtual bool shouldExplore(Use *U);
|
|
|
|
/// captured - Information about the pointer was captured by the user of
|
|
/// use U. Return true to stop the traversal or false to continue looking
|
|
/// for more capturing instructions.
|
|
virtual bool captured(Use *U) = 0;
|
|
};
|
|
|
|
/// PointerMayBeCaptured - Visit the value and the values derived from it and
|
|
/// find values which appear to be capturing the pointer value. This feeds
|
|
/// results into and is controlled by the CaptureTracker object.
|
|
void PointerMayBeCaptured(const Value *V, CaptureTracker *Tracker);
|
|
} // end namespace llvm
|
|
|
|
#endif
|