diff options
Diffstat (limited to 'include/llvm/Transforms/Utils')
| -rw-r--r-- | include/llvm/Transforms/Utils/BasicBlockUtils.h | 11 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/BuildLibCalls.h | 27 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/BypassSlowDivision.h | 13 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/CodeExtractor.h | 57 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/Local.h | 16 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/LoopUtils.h | 5 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/MisExpect.h | 43 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/PredicateInfo.h | 10 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/SimplifyLibCalls.h | 10 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/UnrollLoop.h | 8 | ||||
| -rw-r--r-- | include/llvm/Transforms/Utils/ValueMapper.h | 9 | 
11 files changed, 175 insertions, 34 deletions
| diff --git a/include/llvm/Transforms/Utils/BasicBlockUtils.h b/include/llvm/Transforms/Utils/BasicBlockUtils.h index 4d861ffe9a31..698e57fd0394 100644 --- a/include/llvm/Transforms/Utils/BasicBlockUtils.h +++ b/include/llvm/Transforms/Utils/BasicBlockUtils.h @@ -83,10 +83,16 @@ bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI = nullptr);  /// Attempts to merge a block into its predecessor, if possible. The return  /// value indicates success or failure. +/// By default do not merge blocks if BB's predecessor has multiple successors. +/// If PredecessorWithTwoSuccessors = true, the blocks can only be merged +/// if BB's Pred has a branch to BB and to AnotherBB, and BB has a single +/// successor Sing. In this case the branch will be updated with Sing instead of +/// BB, and BB will still be merged into its predecessor and removed.  bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU = nullptr,                                 LoopInfo *LI = nullptr,                                 MemorySSAUpdater *MSSAU = nullptr, -                               MemoryDependenceResults *MemDep = nullptr); +                               MemoryDependenceResults *MemDep = nullptr, +                               bool PredecessorWithTwoSuccessors = false);  /// Replace all uses of an instruction (specified by BI) with a value, then  /// remove and delete the original instruction. @@ -222,7 +228,8 @@ BasicBlock *SplitEdge(BasicBlock *From, BasicBlock *To,  /// info is updated.  BasicBlock *SplitBlock(BasicBlock *Old, Instruction *SplitPt,                         DominatorTree *DT = nullptr, LoopInfo *LI = nullptr, -                       MemorySSAUpdater *MSSAU = nullptr); +                       MemorySSAUpdater *MSSAU = nullptr, +                       const Twine &BBName = "");  /// This method introduces at least one new basic block into the function and  /// moves some of the predecessors of BB to be predecessors of the new block. diff --git a/include/llvm/Transforms/Utils/BuildLibCalls.h b/include/llvm/Transforms/Utils/BuildLibCalls.h index 8421c31a36da..3d15b2a7bf2a 100644 --- a/include/llvm/Transforms/Utils/BuildLibCalls.h +++ b/include/llvm/Transforms/Utils/BuildLibCalls.h @@ -30,17 +30,16 @@ namespace llvm {    bool inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI);    bool inferLibFuncAttributes(Module *M, StringRef Name, const TargetLibraryInfo &TLI); -  /// Check whether the overloaded unary floating point function +  /// Check whether the overloaded floating point function    /// corresponding to \a Ty is available. -  bool hasUnaryFloatFn(const TargetLibraryInfo *TLI, Type *Ty, -                       LibFunc DoubleFn, LibFunc FloatFn, -                       LibFunc LongDoubleFn); +  bool hasFloatFn(const TargetLibraryInfo *TLI, Type *Ty, +                  LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn); -  /// Get the name of the overloaded unary floating point function +  /// Get the name of the overloaded floating point function    /// corresponding to \a Ty. -  StringRef getUnaryFloatFn(const TargetLibraryInfo *TLI, Type *Ty, -                            LibFunc DoubleFn, LibFunc FloatFn, -                            LibFunc LongDoubleFn); +  StringRef getFloatFnName(const TargetLibraryInfo *TLI, Type *Ty, +                           LibFunc DoubleFn, LibFunc FloatFn, +                           LibFunc LongDoubleFn);    /// Return V if it is an i8*, otherwise cast it to i8*.    Value *castToCStr(Value *V, IRBuilder<> &B); @@ -51,6 +50,11 @@ namespace llvm {    Value *emitStrLen(Value *Ptr, IRBuilder<> &B, const DataLayout &DL,                      const TargetLibraryInfo *TLI); +  /// Emit a call to the strdup function to the builder, for the specified +  /// pointer. Ptr is required to be some pointer type, and the return value has +  /// 'i8*' type. +  Value *emitStrDup(Value *Ptr, IRBuilder<> &B, const TargetLibraryInfo *TLI); +    /// Emit a call to the strnlen function to the builder, for the specified    /// pointer. Ptr is required to be some pointer type, MaxLen must be of size_t    /// type, and the return value has 'intptr_t' type. @@ -164,6 +168,13 @@ namespace llvm {    Value *emitBinaryFloatFnCall(Value *Op1, Value *Op2, StringRef Name,                                 IRBuilder<> &B, const AttributeList &Attrs); +  /// Emit a call to the binary function DoubleFn, FloatFn or LongDoubleFn, +  /// depending of the type of Op1. +  Value *emitBinaryFloatFnCall(Value *Op1, Value *Op2, +                               const TargetLibraryInfo *TLI, LibFunc DoubleFn, +                               LibFunc FloatFn, LibFunc LongDoubleFn, +                               IRBuilder<> &B, const AttributeList &Attrs); +    /// Emit a call to the putchar function. This assumes that Char is an integer.    Value *emitPutChar(Value *Char, IRBuilder<> &B, const TargetLibraryInfo *TLI); diff --git a/include/llvm/Transforms/Utils/BypassSlowDivision.h b/include/llvm/Transforms/Utils/BypassSlowDivision.h index 471055921fa8..bd98c902d1ab 100644 --- a/include/llvm/Transforms/Utils/BypassSlowDivision.h +++ b/include/llvm/Transforms/Utils/BypassSlowDivision.h @@ -19,6 +19,7 @@  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/DenseMapInfo.h" +#include "llvm/IR/ValueHandle.h"  #include <cstdint>  namespace llvm { @@ -28,8 +29,10 @@ class Value;  struct DivRemMapKey {    bool SignedOp; -  Value *Dividend; -  Value *Divisor; +  AssertingVH<Value> Dividend; +  AssertingVH<Value> Divisor; + +  DivRemMapKey() = default;    DivRemMapKey(bool InSignedOp, Value *InDividend, Value *InDivisor)        : SignedOp(InSignedOp), Dividend(InDividend), Divisor(InDivisor) {} @@ -50,8 +53,10 @@ template <> struct DenseMapInfo<DivRemMapKey> {    }    static unsigned getHashValue(const DivRemMapKey &Val) { -    return (unsigned)(reinterpret_cast<uintptr_t>(Val.Dividend) ^ -                      reinterpret_cast<uintptr_t>(Val.Divisor)) ^ +    return (unsigned)(reinterpret_cast<uintptr_t>( +                          static_cast<Value *>(Val.Dividend)) ^ +                      reinterpret_cast<uintptr_t>( +                          static_cast<Value *>(Val.Divisor))) ^             (unsigned)Val.SignedOp;    }  }; diff --git a/include/llvm/Transforms/Utils/CodeExtractor.h b/include/llvm/Transforms/Utils/CodeExtractor.h index 9d79ee1633f6..8a1ab796734e 100644 --- a/include/llvm/Transforms/Utils/CodeExtractor.h +++ b/include/llvm/Transforms/Utils/CodeExtractor.h @@ -22,6 +22,7 @@  namespace llvm { +class AllocaInst;  class BasicBlock;  class BlockFrequency;  class BlockFrequencyInfo; @@ -36,6 +37,38 @@ class Module;  class Type;  class Value; +/// A cache for the CodeExtractor analysis. The operation \ref +/// CodeExtractor::extractCodeRegion is guaranteed not to invalidate this +/// object. This object should conservatively be considered invalid if any +/// other mutating operations on the IR occur. +/// +/// Constructing this object is O(n) in the size of the function. +class CodeExtractorAnalysisCache { +  /// The allocas in the function. +  SmallVector<AllocaInst *, 16> Allocas; + +  /// Base memory addresses of load/store instructions, grouped by block. +  DenseMap<BasicBlock *, DenseSet<Value *>> BaseMemAddrs; + +  /// Blocks which contain instructions which may have unknown side-effects +  /// on memory. +  DenseSet<BasicBlock *> SideEffectingBlocks; + +  void findSideEffectInfoForBlock(BasicBlock &BB); + +public: +  CodeExtractorAnalysisCache(Function &F); + +  /// Get the allocas in the function at the time the analysis was created. +  /// Note that some of these allocas may no longer be present in the function, +  /// due to \ref CodeExtractor::extractCodeRegion. +  ArrayRef<AllocaInst *> getAllocas() const { return Allocas; } + +  /// Check whether \p BB contains an instruction thought to load from, store +  /// to, or otherwise clobber the alloca \p Addr. +  bool doesBlockContainClobberOfAddr(BasicBlock &BB, AllocaInst *Addr) const; +}; +    /// Utility class for extracting code into a new function.    ///    /// This utility provides a simple interface for extracting some sequence of @@ -104,13 +137,21 @@ class Value;      ///      /// Returns zero when called on a CodeExtractor instance where isEligible      /// returns false. -    Function *extractCodeRegion(); +    Function *extractCodeRegion(const CodeExtractorAnalysisCache &CEAC); + +    /// Verify that assumption cache isn't stale after a region is extracted. +    /// Returns false when verifier finds errors. AssumptionCache is passed as +    /// parameter to make this function stateless. +    static bool verifyAssumptionCache(const Function& F, AssumptionCache *AC);      /// Test whether this code extractor is eligible.      ///      /// Based on the blocks used when constructing the code extractor,      /// determine whether it is eligible for extraction. -    bool isEligible() const { return !Blocks.empty(); } +    ///  +    /// Checks that varargs handling (with vastart and vaend) is only done in +    /// the outlined blocks. +    bool isEligible() const;      /// Compute the set of input values and output values for the code.      /// @@ -127,7 +168,9 @@ class Value;      /// region.      ///      /// Returns true if it is safe to do the code motion. -    bool isLegalToShrinkwrapLifetimeMarkers(Instruction *AllocaAddr) const; +    bool +    isLegalToShrinkwrapLifetimeMarkers(const CodeExtractorAnalysisCache &CEAC, +                                       Instruction *AllocaAddr) const;      /// Find the set of allocas whose life ranges are contained within the      /// outlined region. @@ -137,7 +180,8 @@ class Value;      /// are used by the lifetime markers are also candidates for shrink-      /// wrapping. The instructions that need to be sunk are collected in      /// 'Allocas'. -    void findAllocas(ValueSet &SinkCands, ValueSet &HoistCands, +    void findAllocas(const CodeExtractorAnalysisCache &CEAC, +                     ValueSet &SinkCands, ValueSet &HoistCands,                       BasicBlock *&ExitBlock) const;      /// Find or create a block within the outline region for placing hoisted @@ -158,8 +202,9 @@ class Value;        Instruction *LifeEnd = nullptr;      }; -    LifetimeMarkerInfo getLifetimeMarkers(Instruction *Addr, -                                          BasicBlock *ExitBlock) const; +    LifetimeMarkerInfo +    getLifetimeMarkers(const CodeExtractorAnalysisCache &CEAC, +                       Instruction *Addr, BasicBlock *ExitBlock) const;      void severSplitPHINodesOfEntry(BasicBlock *&Header);      void severSplitPHINodesOfExits(const SmallPtrSetImpl<BasicBlock *> &Exits); diff --git a/include/llvm/Transforms/Utils/Local.h b/include/llvm/Transforms/Utils/Local.h index ff516f230979..9fcb2f64d79b 100644 --- a/include/llvm/Transforms/Utils/Local.h +++ b/include/llvm/Transforms/Utils/Local.h @@ -271,6 +271,15 @@ inline unsigned getKnownAlignment(Value *V, const DataLayout &DL,    return getOrEnforceKnownAlignment(V, 0, DL, CxtI, AC, DT);  } +/// Create a call that matches the invoke \p II in terms of arguments, +/// attributes, debug information, etc. The call is not placed in a block and it +/// will not have a name. The invoke instruction is not removed, nor are the +/// uses replaced by the new call. +CallInst *createCallMatchingInvoke(InvokeInst *II); + +/// This function converts the specified invoek into a normall call. +void changeToCall(InvokeInst *II, DomTreeUpdater *DTU = nullptr); +  ///===---------------------------------------------------------------------===//  ///  Dbg Intrinsic utilities  /// @@ -403,8 +412,7 @@ void removeUnwindEdge(BasicBlock *BB, DomTreeUpdater *DTU = nullptr);  /// Remove all blocks that can not be reached from the function's entry.  ///  /// Returns true if any basic block was removed. -bool removeUnreachableBlocks(Function &F, LazyValueInfo *LVI = nullptr, -                             DomTreeUpdater *DTU = nullptr, +bool removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU = nullptr,                               MemorySSAUpdater *MSSAU = nullptr);  /// Combine the metadata of two instructions so that K can replace J. Some @@ -424,6 +432,10 @@ void combineMetadata(Instruction *K, const Instruction *J,  void combineMetadataForCSE(Instruction *K, const Instruction *J,                             bool DoesKMove); +/// Copy the metadata from the source instruction to the destination (the +/// replacement for the source instruction). +void copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source); +  /// Patch the replacement so that it is not more restrictive than the value  /// being replaced. It assumes that the replacement does not get moved from  /// its original position. diff --git a/include/llvm/Transforms/Utils/LoopUtils.h b/include/llvm/Transforms/Utils/LoopUtils.h index 68bdded5cf93..d32f08717e9b 100644 --- a/include/llvm/Transforms/Utils/LoopUtils.h +++ b/include/llvm/Transforms/Utils/LoopUtils.h @@ -215,6 +215,9 @@ makeFollowupLoopID(MDNode *OrigLoopID, ArrayRef<StringRef> FollowupAttrs,  /// Look for the loop attribute that disables all transformation heuristic.  bool hasDisableAllTransformsHint(const Loop *L); +/// Look for the loop attribute that disables the LICM transformation heuristics. +bool hasDisableLICMTransformsHint(const Loop *L); +  /// The mode sets how eager a transformation should be applied.  enum TransformationMode {    /// The pass can use heuristics to determine whether a transformation should @@ -252,6 +255,8 @@ TransformationMode hasLICMVersioningTransformation(Loop *L);  /// @}  /// Set input string into loop metadata by keeping other values intact. +/// If the string is already in loop metadata update value if it is +/// different.  void addStringMetadataToLoop(Loop *TheLoop, const char *MDString,                               unsigned V = 0); diff --git a/include/llvm/Transforms/Utils/MisExpect.h b/include/llvm/Transforms/Utils/MisExpect.h new file mode 100644 index 000000000000..1dbe8cb95936 --- /dev/null +++ b/include/llvm/Transforms/Utils/MisExpect.h @@ -0,0 +1,43 @@ +//===--- MisExpect.h - Check the use of llvm.expect with PGO data ---------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This contains code to emit warnings for potentially incorrect usage of the +// llvm.expect intrinsic. This utility extracts the threshold values from +// metadata associated with the instrumented Branch or Switch instruction. The +// threshold values are then used to determine if a warning should be emmited. +// +//===----------------------------------------------------------------------===// + +#include "llvm/ADT/SmallVector.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/LLVMContext.h" + +namespace llvm { +namespace misexpect { + +/// verifyMisExpect - compares PGO counters to the thresholds used for +/// llvm.expect and warns if the PGO counters are outside of the expected +/// range. +/// \param I The Instruction being checked +/// \param Weights A vector of profile weights for each target block +/// \param Ctx The current LLVM context +void verifyMisExpect(llvm::Instruction *I, +                     const llvm::SmallVector<uint32_t, 4> &Weights, +                     llvm::LLVMContext &Ctx); + +/// checkClangInstrumentation - verify if llvm.expect matches PGO profile +/// This function checks the frontend instrumentation in the backend when +/// lowering llvm.expect intrinsics. It checks for existing metadata, and +/// then validates the use of llvm.expect against the assigned branch weights. +// +/// \param I the Instruction being checked +void checkFrontendInstrumentation(Instruction &I); + +} // namespace misexpect +} // namespace llvm diff --git a/include/llvm/Transforms/Utils/PredicateInfo.h b/include/llvm/Transforms/Utils/PredicateInfo.h index da4a5dcc28c0..7c7a8eb04a2c 100644 --- a/include/llvm/Transforms/Utils/PredicateInfo.h +++ b/include/llvm/Transforms/Utils/PredicateInfo.h @@ -229,10 +229,10 @@ protected:  private:    void buildPredicateInfo(); -  void processAssume(IntrinsicInst *, BasicBlock *, SmallPtrSetImpl<Value *> &); -  void processBranch(BranchInst *, BasicBlock *, SmallPtrSetImpl<Value *> &); -  void processSwitch(SwitchInst *, BasicBlock *, SmallPtrSetImpl<Value *> &); -  void renameUses(SmallPtrSetImpl<Value *> &); +  void processAssume(IntrinsicInst *, BasicBlock *, SmallVectorImpl<Value *> &); +  void processBranch(BranchInst *, BasicBlock *, SmallVectorImpl<Value *> &); +  void processSwitch(SwitchInst *, BasicBlock *, SmallVectorImpl<Value *> &); +  void renameUses(SmallVectorImpl<Value *> &);    using ValueDFS = PredicateInfoClasses::ValueDFS;    typedef SmallVectorImpl<ValueDFS> ValueDFSStack;    void convertUsesToDFSOrdered(Value *, SmallVectorImpl<ValueDFS> &); @@ -240,7 +240,7 @@ private:    bool stackIsInScope(const ValueDFSStack &, const ValueDFS &) const;    void popStackUntilDFSScope(ValueDFSStack &, const ValueDFS &);    ValueInfo &getOrCreateValueInfo(Value *); -  void addInfoFor(SmallPtrSetImpl<Value *> &OpsToRename, Value *Op, +  void addInfoFor(SmallVectorImpl<Value *> &OpsToRename, Value *Op,                    PredicateBase *PB);    const ValueInfo &getValueInfo(Value *) const;    Function &F; diff --git a/include/llvm/Transforms/Utils/SimplifyLibCalls.h b/include/llvm/Transforms/Utils/SimplifyLibCalls.h index 2572094ddac8..88c2ef787ad8 100644 --- a/include/llvm/Transforms/Utils/SimplifyLibCalls.h +++ b/include/llvm/Transforms/Utils/SimplifyLibCalls.h @@ -126,6 +126,12 @@ private:    /// Erase an instruction from its parent with our eraser.    void eraseFromParent(Instruction *I); +  /// Replace an instruction with a value and erase it from its parent. +  void substituteInParent(Instruction *I, Value *With) { +    replaceAllUsesWith(I, With); +    eraseFromParent(I); +  } +    Value *foldMallocMemset(CallInst *Memset, IRBuilder<> &B);  public: @@ -154,6 +160,7 @@ private:    Value *optimizeStrRChr(CallInst *CI, IRBuilder<> &B);    Value *optimizeStrCmp(CallInst *CI, IRBuilder<> &B);    Value *optimizeStrNCmp(CallInst *CI, IRBuilder<> &B); +  Value *optimizeStrNDup(CallInst *CI, IRBuilder<> &B);    Value *optimizeStrCpy(CallInst *CI, IRBuilder<> &B);    Value *optimizeStpCpy(CallInst *CI, IRBuilder<> &B);    Value *optimizeStrNCpy(CallInst *CI, IRBuilder<> &B); @@ -164,14 +171,17 @@ private:    Value *optimizeStrCSpn(CallInst *CI, IRBuilder<> &B);    Value *optimizeStrStr(CallInst *CI, IRBuilder<> &B);    Value *optimizeMemChr(CallInst *CI, IRBuilder<> &B); +  Value *optimizeMemRChr(CallInst *CI, IRBuilder<> &B);    Value *optimizeMemCmp(CallInst *CI, IRBuilder<> &B);    Value *optimizeBCmp(CallInst *CI, IRBuilder<> &B);    Value *optimizeMemCmpBCmpCommon(CallInst *CI, IRBuilder<> &B); +  Value *optimizeMemPCpy(CallInst *CI, IRBuilder<> &B);    Value *optimizeMemCpy(CallInst *CI, IRBuilder<> &B);    Value *optimizeMemMove(CallInst *CI, IRBuilder<> &B);    Value *optimizeMemSet(CallInst *CI, IRBuilder<> &B);    Value *optimizeRealloc(CallInst *CI, IRBuilder<> &B);    Value *optimizeWcslen(CallInst *CI, IRBuilder<> &B); +  Value *optimizeBCopy(CallInst *CI, IRBuilder<> &B);    // Wrapper for all String/Memory Library Call Optimizations    Value *optimizeStringMemoryLibCall(CallInst *CI, IRBuilder<> &B); diff --git a/include/llvm/Transforms/Utils/UnrollLoop.h b/include/llvm/Transforms/Utils/UnrollLoop.h index 593ca26feb98..02b81b4b7ee2 100644 --- a/include/llvm/Transforms/Utils/UnrollLoop.h +++ b/include/llvm/Transforms/Utils/UnrollLoop.h @@ -114,8 +114,8 @@ bool computeUnrollCount(Loop *L, const TargetTransformInfo &TTI,                          DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE,                          const SmallPtrSetImpl<const Value *> &EphValues,                          OptimizationRemarkEmitter *ORE, unsigned &TripCount, -                        unsigned MaxTripCount, unsigned &TripMultiple, -                        unsigned LoopSize, +                        unsigned MaxTripCount, bool MaxOrZero, +                        unsigned &TripMultiple, unsigned LoopSize,                          TargetTransformInfo::UnrollingPreferences &UP,                          bool &UseUpperBound); @@ -132,7 +132,9 @@ TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(      BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, int OptLevel,      Optional<unsigned> UserThreshold, Optional<unsigned> UserCount,      Optional<bool> UserAllowPartial, Optional<bool> UserRuntime, -    Optional<bool> UserUpperBound, Optional<bool> UserAllowPeeling); +    Optional<bool> UserUpperBound, Optional<bool> UserAllowPeeling, +    Optional<bool> UserAllowProfileBasedPeeling, +    Optional<unsigned> UserFullUnrollMaxCount);  unsigned ApproximateLoopSize(const Loop *L, unsigned &NumCalls,                               bool &NotDuplicatable, bool &Convergent, diff --git a/include/llvm/Transforms/Utils/ValueMapper.h b/include/llvm/Transforms/Utils/ValueMapper.h index 1952a210291e..ff5bfc609586 100644 --- a/include/llvm/Transforms/Utils/ValueMapper.h +++ b/include/llvm/Transforms/Utils/ValueMapper.h @@ -22,7 +22,7 @@ namespace llvm {  class Constant;  class Function; -class GlobalAlias; +class GlobalIndirectSymbol;  class GlobalVariable;  class Instruction;  class MDNode; @@ -120,7 +120,7 @@ inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {  /// instance:  /// - \a scheduleMapGlobalInitializer()  /// - \a scheduleMapAppendingVariable() -/// - \a scheduleMapGlobalAliasee() +/// - \a scheduleMapGlobalIndirectSymbol()  /// - \a scheduleRemapFunction()  ///  /// Sometimes a callback needs a different mapping context.  Such a context can @@ -180,8 +180,9 @@ public:                                      bool IsOldCtorDtor,                                      ArrayRef<Constant *> NewMembers,                                      unsigned MappingContextID = 0); -  void scheduleMapGlobalAliasee(GlobalAlias &GA, Constant &Aliasee, -                                unsigned MappingContextID = 0); +  void scheduleMapGlobalIndirectSymbol(GlobalIndirectSymbol &GIS, +                                       Constant &Target, +                                       unsigned MappingContextID = 0);    void scheduleRemapFunction(Function &F, unsigned MappingContextID = 0);  }; | 
