From: Chandler Carruth Date: Sun, 19 Jan 2014 02:13:50 +0000 (+0000) Subject: Add a const lookup routine to get a BlockAddress constant if there is X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=60e425e99ba7ef05b7a52c7068a67c6baa25da38;p=oota-llvm.git Add a const lookup routine to get a BlockAddress constant if there is one, but not create one. This is useful in the verifier when we want to query the constant if it exists but not create one. To be used in an upcoming commit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199568 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Constants.h b/include/llvm/IR/Constants.h index 1acf5b6cc83..448d82931a6 100644 --- a/include/llvm/IR/Constants.h +++ b/include/llvm/IR/Constants.h @@ -757,6 +757,12 @@ public: /// block must be embedded into a function. static BlockAddress *get(BasicBlock *BB); + /// \brief Lookup an existing \c BlockAddress constant for the given + /// BasicBlock. + /// + /// \returns 0 if \c !BB->hasAddressTaken(), otherwise the \c BlockAddress. + static BlockAddress *lookup(const BasicBlock *BB); + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); diff --git a/lib/IR/Constants.cpp b/lib/IR/Constants.cpp index 1f6f5ac4270..ecd2cfd9fd1 100644 --- a/lib/IR/Constants.cpp +++ b/lib/IR/Constants.cpp @@ -1375,6 +1375,17 @@ BlockAddress::BlockAddress(Function *F, BasicBlock *BB) BB->AdjustBlockAddressRefCount(1); } +BlockAddress *BlockAddress::lookup(const BasicBlock *BB) { + if (!BB->hasAddressTaken()) + return 0; + + const Function *F = BB->getParent(); + assert(F != 0 && "Block must have a parent"); + BlockAddress *BA = + F->getContext().pImpl->BlockAddresses.lookup(std::make_pair(F, BB)); + assert(BA && "Refcount and block address map disagree!"); + return BA; +} // destroyConstant - Remove the constant from the constant table. // diff --git a/lib/IR/LLVMContextImpl.h b/lib/IR/LLVMContextImpl.h index 39e5d778ed6..04338272463 100644 --- a/lib/IR/LLVMContextImpl.h +++ b/lib/IR/LLVMContextImpl.h @@ -281,8 +281,8 @@ public: StringMap CDSConstants; - - DenseMap , BlockAddress*> BlockAddresses; + DenseMap, BlockAddress *> + BlockAddresses; ConstantUniqueMap ExprConstants;