Add a const lookup routine to get a BlockAddress constant if there is
authorChandler Carruth <chandlerc@gmail.com>
Sun, 19 Jan 2014 02:13:50 +0000 (02:13 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sun, 19 Jan 2014 02:13:50 +0000 (02:13 +0000)
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

include/llvm/IR/Constants.h
lib/IR/Constants.cpp
lib/IR/LLVMContextImpl.h

index 1acf5b6cc8342433fccca7ea0afbda07330a9f59..448d82931a6e66e04033b69baeedaa106c548670 100644 (file)
@@ -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);
 
index 1f6f5ac4270c22f581826f20e0f893a6b228a2ae..ecd2cfd9fd1db9ff0001dfc9d4835fddb67340ca 100644 (file)
@@ -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.
 //
index 39e5d778ed68a6bfc68015d5e69431e39f2eb65d..0433827246324dc42d1835ad26fd545735df16fc 100644 (file)
@@ -281,8 +281,8 @@ public:
   
   StringMap<ConstantDataSequential*> CDSConstants;
 
-  
-  DenseMap<std::pair<Function*, BasicBlock*> , BlockAddress*> BlockAddresses;
+  DenseMap<std::pair<const Function *, const BasicBlock *>, BlockAddress *>
+    BlockAddresses;
   ConstantUniqueMap<ExprMapKeyType, const ExprMapKeyType&, Type, ConstantExpr>
     ExprConstants;