2010-03-21 21:17:34 +00:00
|
|
|
//===-- LLVMContextImpl.h - The LLVMContextImpl opaque class ----*- C++ -*-===//
|
2009-06-30 00:48:55 +00:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2009-06-30 17:06:46 +00:00
|
|
|
//
|
|
|
|
// This file declares LLVMContextImpl, the opaque implementation
|
|
|
|
// of LLVMContext.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2009-06-30 00:48:55 +00:00
|
|
|
|
|
|
|
#ifndef LLVM_LLVMCONTEXT_IMPL_H
|
|
|
|
#define LLVM_LLVMCONTEXT_IMPL_H
|
|
|
|
|
2012-12-20 01:36:59 +00:00
|
|
|
#include "AttributeImpl.h"
|
2009-08-04 22:41:48 +00:00
|
|
|
#include "ConstantsContext.h"
|
2009-08-19 17:07:46 +00:00
|
|
|
#include "LeaksContext.h"
|
2009-07-16 19:05:41 +00:00
|
|
|
#include "llvm/ADT/APFloat.h"
|
2009-07-16 18:04:31 +00:00
|
|
|
#include "llvm/ADT/APInt.h"
|
2011-06-22 08:50:06 +00:00
|
|
|
#include "llvm/ADT/ArrayRef.h"
|
2009-07-16 18:04:31 +00:00
|
|
|
#include "llvm/ADT/DenseMap.h"
|
2009-07-16 23:44:30 +00:00
|
|
|
#include "llvm/ADT/FoldingSet.h"
|
2012-12-04 07:12:27 +00:00
|
|
|
#include "llvm/ADT/Hashing.h"
|
2009-12-17 19:55:06 +00:00
|
|
|
#include "llvm/ADT/SmallPtrSet.h"
|
2009-07-16 22:11:26 +00:00
|
|
|
#include "llvm/ADT/StringMap.h"
|
2013-01-02 11:36:10 +00:00
|
|
|
#include "llvm/IR/Constants.h"
|
|
|
|
#include "llvm/IR/DerivedTypes.h"
|
|
|
|
#include "llvm/IR/LLVMContext.h"
|
|
|
|
#include "llvm/IR/Metadata.h"
|
2014-03-04 11:17:44 +00:00
|
|
|
#include "llvm/IR/ValueHandle.h"
|
2009-07-23 23:25:33 +00:00
|
|
|
#include <vector>
|
2009-07-21 20:13:12 +00:00
|
|
|
|
2009-06-30 00:48:55 +00:00
|
|
|
namespace llvm {
|
2009-07-24 23:12:02 +00:00
|
|
|
|
2009-07-16 18:04:31 +00:00
|
|
|
class ConstantInt;
|
2009-07-16 19:05:41 +00:00
|
|
|
class ConstantFP;
|
2009-08-11 17:45:13 +00:00
|
|
|
class LLVMContext;
|
2009-07-16 18:04:31 +00:00
|
|
|
class Type;
|
2009-07-16 23:44:30 +00:00
|
|
|
class Value;
|
2014-04-28 18:19:25 +00:00
|
|
|
struct PassRunListener;
|
2009-07-16 18:04:31 +00:00
|
|
|
|
2013-09-11 18:05:11 +00:00
|
|
|
struct DenseMapAPIntKeyInfo {
|
2009-07-16 18:04:31 +00:00
|
|
|
struct KeyTy {
|
|
|
|
APInt val;
|
2011-07-18 04:54:35 +00:00
|
|
|
Type* type;
|
|
|
|
KeyTy(const APInt& V, Type* Ty) : val(V), type(Ty) {}
|
2009-07-16 18:04:31 +00:00
|
|
|
bool operator==(const KeyTy& that) const {
|
|
|
|
return type == that.type && this->val == that.val;
|
|
|
|
}
|
|
|
|
bool operator!=(const KeyTy& that) const {
|
|
|
|
return !this->operator==(that);
|
|
|
|
}
|
2012-03-04 12:02:57 +00:00
|
|
|
friend hash_code hash_value(const KeyTy &Key) {
|
|
|
|
return hash_combine(Key.type, Key.val);
|
|
|
|
}
|
2009-07-16 18:04:31 +00:00
|
|
|
};
|
2014-04-28 04:05:08 +00:00
|
|
|
static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), nullptr); }
|
|
|
|
static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), nullptr); }
|
2009-07-16 18:04:31 +00:00
|
|
|
static unsigned getHashValue(const KeyTy &Key) {
|
2012-03-04 12:02:57 +00:00
|
|
|
return static_cast<unsigned>(hash_value(Key));
|
2009-07-16 18:04:31 +00:00
|
|
|
}
|
|
|
|
static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
|
|
|
|
return LHS == RHS;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-09-11 18:05:11 +00:00
|
|
|
struct DenseMapAPFloatKeyInfo {
|
2009-07-16 19:05:41 +00:00
|
|
|
struct KeyTy {
|
|
|
|
APFloat val;
|
|
|
|
KeyTy(const APFloat& V) : val(V){}
|
|
|
|
bool operator==(const KeyTy& that) const {
|
|
|
|
return this->val.bitwiseIsEqual(that.val);
|
|
|
|
}
|
|
|
|
bool operator!=(const KeyTy& that) const {
|
|
|
|
return !this->operator==(that);
|
|
|
|
}
|
2012-03-04 12:02:57 +00:00
|
|
|
friend hash_code hash_value(const KeyTy &Key) {
|
|
|
|
return hash_combine(Key.val);
|
|
|
|
}
|
2009-07-16 19:05:41 +00:00
|
|
|
};
|
|
|
|
static inline KeyTy getEmptyKey() {
|
|
|
|
return KeyTy(APFloat(APFloat::Bogus,1));
|
|
|
|
}
|
|
|
|
static inline KeyTy getTombstoneKey() {
|
|
|
|
return KeyTy(APFloat(APFloat::Bogus,2));
|
|
|
|
}
|
|
|
|
static unsigned getHashValue(const KeyTy &Key) {
|
2012-03-04 12:02:57 +00:00
|
|
|
return static_cast<unsigned>(hash_value(Key));
|
2009-07-16 19:05:41 +00:00
|
|
|
}
|
|
|
|
static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
|
|
|
|
return LHS == RHS;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-09-11 18:05:11 +00:00
|
|
|
struct AnonStructTypeKeyInfo {
|
2012-02-23 09:17:40 +00:00
|
|
|
struct KeyTy {
|
|
|
|
ArrayRef<Type*> ETypes;
|
|
|
|
bool isPacked;
|
|
|
|
KeyTy(const ArrayRef<Type*>& E, bool P) :
|
|
|
|
ETypes(E), isPacked(P) {}
|
|
|
|
KeyTy(const StructType* ST) :
|
|
|
|
ETypes(ArrayRef<Type*>(ST->element_begin(), ST->element_end())),
|
|
|
|
isPacked(ST->isPacked()) {}
|
|
|
|
bool operator==(const KeyTy& that) const {
|
|
|
|
if (isPacked != that.isPacked)
|
|
|
|
return false;
|
|
|
|
if (ETypes != that.ETypes)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
bool operator!=(const KeyTy& that) const {
|
|
|
|
return !this->operator==(that);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
static inline StructType* getEmptyKey() {
|
|
|
|
return DenseMapInfo<StructType*>::getEmptyKey();
|
|
|
|
}
|
|
|
|
static inline StructType* getTombstoneKey() {
|
|
|
|
return DenseMapInfo<StructType*>::getTombstoneKey();
|
|
|
|
}
|
|
|
|
static unsigned getHashValue(const KeyTy& Key) {
|
Rewrite LLVM's generalized support library for hashing to follow the API
of the proposed standard hashing interfaces (N3333), and to use
a modified and tuned version of the CityHash algorithm.
Some of the highlights of this change:
-- Significantly higher quality hashing algorithm with very well
distributed results, and extremely few collisions. Should be close to
a checksum for up to 64-bit keys. Very little clustering or clumping of
hash codes, to better distribute load on probed hash tables.
-- Built-in support for reserved values.
-- Simplified API that composes cleanly with other C++ idioms and APIs.
-- Better scaling performance as keys grow. This is the fastest
algorithm I've found and measured for moderately sized keys (such as
show up in some of the uniquing and folding use cases)
-- Support for enabling per-execution seeds to prevent table ordering
or other artifacts of hashing algorithms to impact the output of
LLVM. The seeding would make each run different and highlight these
problems during bootstrap.
This implementation was tested extensively using the SMHasher test
suite, and pased with flying colors, doing better than the original
CityHash algorithm even.
I've included a unittest, although it is somewhat minimal at the moment.
I've also added (or refactored into the proper location) type traits
necessary to implement this, and converted users of GeneralHash over.
My only immediate concerns with this implementation is the performance
of hashing small keys. I've already started working to improve this, and
will continue to do so. Currently, the only algorithms faster produce
lower quality results, but it is likely there is a better compromise
than the current one.
Many thanks to Jeffrey Yasskin who did most of the work on the N3333
paper, pair-programmed some of this code, and reviewed much of it. Many
thanks also go to Geoff Pike Pike and Jyrki Alakuijala, the original
authors of CityHash on which this is heavily based, and Austin Appleby
who created MurmurHash and the SMHasher test suite.
Also thanks to Nadav, Tobias, Howard, Jay, Nick, Ahmed, and Duncan for
all of the review comments! If there are further comments or concerns,
please let me know and I'll jump on 'em.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151822 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-01 18:55:25 +00:00
|
|
|
return hash_combine(hash_combine_range(Key.ETypes.begin(),
|
|
|
|
Key.ETypes.end()),
|
|
|
|
Key.isPacked);
|
2012-02-23 09:17:40 +00:00
|
|
|
}
|
|
|
|
static unsigned getHashValue(const StructType *ST) {
|
|
|
|
return getHashValue(KeyTy(ST));
|
|
|
|
}
|
|
|
|
static bool isEqual(const KeyTy& LHS, const StructType *RHS) {
|
|
|
|
if (RHS == getEmptyKey() || RHS == getTombstoneKey())
|
|
|
|
return false;
|
|
|
|
return LHS == KeyTy(RHS);
|
|
|
|
}
|
|
|
|
static bool isEqual(const StructType *LHS, const StructType *RHS) {
|
|
|
|
return LHS == RHS;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-09-11 18:05:11 +00:00
|
|
|
struct FunctionTypeKeyInfo {
|
2012-02-23 09:17:40 +00:00
|
|
|
struct KeyTy {
|
|
|
|
const Type *ReturnType;
|
|
|
|
ArrayRef<Type*> Params;
|
|
|
|
bool isVarArg;
|
|
|
|
KeyTy(const Type* R, const ArrayRef<Type*>& P, bool V) :
|
|
|
|
ReturnType(R), Params(P), isVarArg(V) {}
|
|
|
|
KeyTy(const FunctionType* FT) :
|
|
|
|
ReturnType(FT->getReturnType()),
|
|
|
|
Params(ArrayRef<Type*>(FT->param_begin(), FT->param_end())),
|
|
|
|
isVarArg(FT->isVarArg()) {}
|
|
|
|
bool operator==(const KeyTy& that) const {
|
|
|
|
if (ReturnType != that.ReturnType)
|
|
|
|
return false;
|
|
|
|
if (isVarArg != that.isVarArg)
|
|
|
|
return false;
|
|
|
|
if (Params != that.Params)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
bool operator!=(const KeyTy& that) const {
|
|
|
|
return !this->operator==(that);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
static inline FunctionType* getEmptyKey() {
|
|
|
|
return DenseMapInfo<FunctionType*>::getEmptyKey();
|
|
|
|
}
|
|
|
|
static inline FunctionType* getTombstoneKey() {
|
|
|
|
return DenseMapInfo<FunctionType*>::getTombstoneKey();
|
|
|
|
}
|
|
|
|
static unsigned getHashValue(const KeyTy& Key) {
|
Rewrite LLVM's generalized support library for hashing to follow the API
of the proposed standard hashing interfaces (N3333), and to use
a modified and tuned version of the CityHash algorithm.
Some of the highlights of this change:
-- Significantly higher quality hashing algorithm with very well
distributed results, and extremely few collisions. Should be close to
a checksum for up to 64-bit keys. Very little clustering or clumping of
hash codes, to better distribute load on probed hash tables.
-- Built-in support for reserved values.
-- Simplified API that composes cleanly with other C++ idioms and APIs.
-- Better scaling performance as keys grow. This is the fastest
algorithm I've found and measured for moderately sized keys (such as
show up in some of the uniquing and folding use cases)
-- Support for enabling per-execution seeds to prevent table ordering
or other artifacts of hashing algorithms to impact the output of
LLVM. The seeding would make each run different and highlight these
problems during bootstrap.
This implementation was tested extensively using the SMHasher test
suite, and pased with flying colors, doing better than the original
CityHash algorithm even.
I've included a unittest, although it is somewhat minimal at the moment.
I've also added (or refactored into the proper location) type traits
necessary to implement this, and converted users of GeneralHash over.
My only immediate concerns with this implementation is the performance
of hashing small keys. I've already started working to improve this, and
will continue to do so. Currently, the only algorithms faster produce
lower quality results, but it is likely there is a better compromise
than the current one.
Many thanks to Jeffrey Yasskin who did most of the work on the N3333
paper, pair-programmed some of this code, and reviewed much of it. Many
thanks also go to Geoff Pike Pike and Jyrki Alakuijala, the original
authors of CityHash on which this is heavily based, and Austin Appleby
who created MurmurHash and the SMHasher test suite.
Also thanks to Nadav, Tobias, Howard, Jay, Nick, Ahmed, and Duncan for
all of the review comments! If there are further comments or concerns,
please let me know and I'll jump on 'em.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151822 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-01 18:55:25 +00:00
|
|
|
return hash_combine(Key.ReturnType,
|
|
|
|
hash_combine_range(Key.Params.begin(),
|
|
|
|
Key.Params.end()),
|
|
|
|
Key.isVarArg);
|
2012-02-23 09:17:40 +00:00
|
|
|
}
|
|
|
|
static unsigned getHashValue(const FunctionType *FT) {
|
|
|
|
return getHashValue(KeyTy(FT));
|
|
|
|
}
|
|
|
|
static bool isEqual(const KeyTy& LHS, const FunctionType *RHS) {
|
|
|
|
if (RHS == getEmptyKey() || RHS == getTombstoneKey())
|
|
|
|
return false;
|
|
|
|
return LHS == KeyTy(RHS);
|
|
|
|
}
|
|
|
|
static bool isEqual(const FunctionType *LHS, const FunctionType *RHS) {
|
|
|
|
return LHS == RHS;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2012-04-11 14:06:54 +00:00
|
|
|
// Provide a FoldingSetTrait::Equals specialization for MDNode that can use a
|
|
|
|
// shortcut to avoid comparing all operands.
|
|
|
|
template<> struct FoldingSetTrait<MDNode> : DefaultFoldingSetTrait<MDNode> {
|
|
|
|
static bool Equals(const MDNode &X, const FoldingSetNodeID &ID,
|
|
|
|
unsigned IDHash, FoldingSetNodeID &TempID) {
|
|
|
|
assert(!X.isNotUniqued() && "Non-uniqued MDNode in FoldingSet?");
|
|
|
|
// First, check if the cached hashes match. If they don't we can skip the
|
|
|
|
// expensive operand walk.
|
|
|
|
if (X.Hash != IDHash)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// If they match we have to compare the operands.
|
|
|
|
X.Profile(TempID);
|
|
|
|
return TempID == ID;
|
|
|
|
}
|
|
|
|
static unsigned ComputeHash(const MDNode &X, FoldingSetNodeID &) {
|
|
|
|
return X.Hash; // Return cached hash.
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-04-01 00:37:44 +00:00
|
|
|
/// DebugRecVH - This is a CallbackVH used to keep the Scope -> index maps
|
|
|
|
/// up to date as MDNodes mutate. This class is implemented in DebugLoc.cpp.
|
2013-09-11 18:05:11 +00:00
|
|
|
class DebugRecVH : public CallbackVH {
|
2010-04-01 00:37:44 +00:00
|
|
|
/// Ctx - This is the LLVM Context being referenced.
|
|
|
|
LLVMContextImpl *Ctx;
|
|
|
|
|
|
|
|
/// Idx - The index into either ScopeRecordIdx or ScopeInlinedAtRecords that
|
|
|
|
/// this reference lives in. If this is zero, then it represents a
|
|
|
|
/// non-canonical entry that has no DenseMap value. This can happen due to
|
|
|
|
/// RAUW.
|
|
|
|
int Idx;
|
|
|
|
public:
|
|
|
|
DebugRecVH(MDNode *n, LLVMContextImpl *ctx, int idx)
|
|
|
|
: CallbackVH(n), Ctx(ctx), Idx(idx) {}
|
|
|
|
|
|
|
|
MDNode *get() const {
|
|
|
|
return cast_or_null<MDNode>(getValPtr());
|
|
|
|
}
|
2014-03-05 06:35:38 +00:00
|
|
|
|
|
|
|
void deleted() override;
|
|
|
|
void allUsesReplacedWith(Value *VNew) override;
|
2010-04-01 00:37:44 +00:00
|
|
|
};
|
|
|
|
|
2013-09-11 18:05:11 +00:00
|
|
|
class LLVMContextImpl {
|
2009-08-11 17:45:13 +00:00
|
|
|
public:
|
2010-09-08 18:03:32 +00:00
|
|
|
/// OwnedModules - The set of modules instantiated in this context, and which
|
|
|
|
/// will be automatically deleted if this context is deleted.
|
|
|
|
SmallPtrSet<Module*, 4> OwnedModules;
|
|
|
|
|
2013-02-11 05:37:07 +00:00
|
|
|
LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler;
|
|
|
|
void *InlineAsmDiagContext;
|
2013-12-17 17:47:22 +00:00
|
|
|
|
|
|
|
LLVMContext::DiagnosticHandlerTy DiagnosticHandler;
|
|
|
|
void *DiagnosticContext;
|
|
|
|
|
|
|
|
typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt *,
|
|
|
|
DenseMapAPIntKeyInfo> IntMapTy;
|
2009-07-16 18:04:31 +00:00
|
|
|
IntMapTy IntConstants;
|
|
|
|
|
2009-07-16 19:05:41 +00:00
|
|
|
typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*,
|
2009-08-04 22:41:48 +00:00
|
|
|
DenseMapAPFloatKeyInfo> FPMapTy;
|
2009-07-16 19:05:41 +00:00
|
|
|
FPMapTy FPConstants;
|
2012-09-26 21:07:29 +00:00
|
|
|
|
2012-12-20 01:36:59 +00:00
|
|
|
FoldingSet<AttributeImpl> AttrsSet;
|
2012-12-19 22:42:22 +00:00
|
|
|
FoldingSet<AttributeSetImpl> AttrsLists;
|
2013-01-24 00:06:56 +00:00
|
|
|
FoldingSet<AttributeSetNode> AttrsSetNodes;
|
2012-11-20 05:09:20 +00:00
|
|
|
|
2012-04-10 20:12:16 +00:00
|
|
|
StringMap<Value*> MDStringCache;
|
2012-09-26 21:07:29 +00:00
|
|
|
|
2009-09-03 01:39:20 +00:00
|
|
|
FoldingSet<MDNode> MDNodeSet;
|
2012-09-26 21:07:29 +00:00
|
|
|
|
2010-03-13 01:26:15 +00:00
|
|
|
// MDNodes may be uniqued or not uniqued. When they're not uniqued, they
|
|
|
|
// aren't in the MDNodeSet, but they're still shared between objects, so no
|
|
|
|
// one object can destroy them. This set allows us to at least destroy them
|
|
|
|
// on Context destruction.
|
|
|
|
SmallPtrSet<MDNode*, 1> NonUniquedMDNodes;
|
2009-09-03 01:39:20 +00:00
|
|
|
|
2012-01-23 15:20:12 +00:00
|
|
|
DenseMap<Type*, ConstantAggregateZero*> CAZConstants;
|
2009-08-10 18:16:08 +00:00
|
|
|
|
2012-02-05 20:54:10 +00:00
|
|
|
typedef ConstantAggrUniqueMap<ArrayType, ConstantArray> ArrayConstantsTy;
|
2009-07-24 23:12:02 +00:00
|
|
|
ArrayConstantsTy ArrayConstants;
|
2009-07-21 20:13:12 +00:00
|
|
|
|
2012-02-05 20:54:10 +00:00
|
|
|
typedef ConstantAggrUniqueMap<StructType, ConstantStruct> StructConstantsTy;
|
2009-07-24 23:12:02 +00:00
|
|
|
StructConstantsTy StructConstants;
|
2009-07-23 23:25:33 +00:00
|
|
|
|
2012-02-05 20:54:10 +00:00
|
|
|
typedef ConstantAggrUniqueMap<VectorType, ConstantVector> VectorConstantsTy;
|
2009-07-24 23:12:02 +00:00
|
|
|
VectorConstantsTy VectorConstants;
|
2009-07-24 00:36:24 +00:00
|
|
|
|
2012-01-23 15:20:12 +00:00
|
|
|
DenseMap<PointerType*, ConstantPointerNull*> CPNConstants;
|
|
|
|
|
|
|
|
DenseMap<Type*, UndefValue*> UVConstants;
|
2009-07-31 22:45:43 +00:00
|
|
|
|
2012-01-23 22:57:10 +00:00
|
|
|
StringMap<ConstantDataSequential*> CDSConstants;
|
|
|
|
|
2014-01-19 02:13:50 +00:00
|
|
|
DenseMap<std::pair<const Function *, const BasicBlock *>, BlockAddress *>
|
|
|
|
BlockAddresses;
|
2011-06-22 08:50:06 +00:00
|
|
|
ConstantUniqueMap<ExprMapKeyType, const ExprMapKeyType&, Type, ConstantExpr>
|
|
|
|
ExprConstants;
|
2010-03-21 20:37:19 +00:00
|
|
|
|
2011-06-22 08:50:06 +00:00
|
|
|
ConstantUniqueMap<InlineAsmKeyType, const InlineAsmKeyType&, PointerType,
|
|
|
|
InlineAsm> InlineAsms;
|
2009-08-04 20:25:11 +00:00
|
|
|
|
2009-07-21 02:47:59 +00:00
|
|
|
ConstantInt *TheTrueVal;
|
|
|
|
ConstantInt *TheFalseVal;
|
|
|
|
|
2009-08-19 17:07:46 +00:00
|
|
|
LeakDetectorImpl<Value> LLVMObjects;
|
|
|
|
|
2009-08-25 16:00:35 +00:00
|
|
|
// Basic type instances.
|
2011-12-17 00:04:22 +00:00
|
|
|
Type VoidTy, LabelTy, HalfTy, FloatTy, DoubleTy, MetadataTy;
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134829 91177308-0d34-0410-b5e6-96231b3b80d8
2011-07-09 17:41:24 +00:00
|
|
|
Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy;
|
|
|
|
IntegerType Int1Ty, Int8Ty, Int16Ty, Int32Ty, Int64Ty;
|
2010-02-11 06:41:30 +00:00
|
|
|
|
2011-07-15 05:49:15 +00:00
|
|
|
|
|
|
|
/// TypeAllocator - All dynamically allocated types are allocated from this.
|
|
|
|
/// They live forever until the context is torn down.
|
|
|
|
BumpPtrAllocator TypeAllocator;
|
|
|
|
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134829 91177308-0d34-0410-b5e6-96231b3b80d8
2011-07-09 17:41:24 +00:00
|
|
|
DenseMap<unsigned, IntegerType*> IntegerTypes;
|
|
|
|
|
2012-02-23 09:17:40 +00:00
|
|
|
typedef DenseMap<FunctionType*, bool, FunctionTypeKeyInfo> FunctionTypeMap;
|
|
|
|
FunctionTypeMap FunctionTypes;
|
|
|
|
typedef DenseMap<StructType*, bool, AnonStructTypeKeyInfo> StructTypeMap;
|
|
|
|
StructTypeMap AnonStructTypes;
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134829 91177308-0d34-0410-b5e6-96231b3b80d8
2011-07-09 17:41:24 +00:00
|
|
|
StringMap<StructType*> NamedStructTypes;
|
|
|
|
unsigned NamedStructTypesUniqueID;
|
|
|
|
|
|
|
|
DenseMap<std::pair<Type *, uint64_t>, ArrayType*> ArrayTypes;
|
|
|
|
DenseMap<std::pair<Type *, unsigned>, VectorType*> VectorTypes;
|
|
|
|
DenseMap<Type*, PointerType*> PointerTypes; // Pointers in AddrSpace = 0
|
|
|
|
DenseMap<std::pair<Type*, unsigned>, PointerType*> ASPointerTypes;
|
2010-02-11 06:41:30 +00:00
|
|
|
|
2009-12-17 19:55:06 +00:00
|
|
|
|
2009-08-18 18:28:58 +00:00
|
|
|
/// ValueHandles - This map keeps track of all of the value handles that are
|
|
|
|
/// watching a Value*. The Value::HasValueHandle bit is used to know
|
2013-03-01 18:48:54 +00:00
|
|
|
/// whether or not a value has an entry in this map.
|
2009-08-18 18:28:58 +00:00
|
|
|
typedef DenseMap<Value*, ValueHandleBase*> ValueHandlesTy;
|
|
|
|
ValueHandlesTy ValueHandles;
|
|
|
|
|
2009-12-29 09:01:33 +00:00
|
|
|
/// CustomMDKindNames - Map to hold the metadata string to ID mapping.
|
|
|
|
StringMap<unsigned> CustomMDKindNames;
|
|
|
|
|
|
|
|
typedef std::pair<unsigned, TrackingVH<MDNode> > MDPairTy;
|
|
|
|
typedef SmallVector<MDPairTy, 2> MDMapTy;
|
|
|
|
|
|
|
|
/// MetadataStore - Collection of per-instruction metadata used in this
|
|
|
|
/// context.
|
|
|
|
DenseMap<const Instruction *, MDMapTy> MetadataStore;
|
|
|
|
|
2010-04-01 00:37:44 +00:00
|
|
|
/// ScopeRecordIdx - This is the index in ScopeRecords for an MDNode scope
|
|
|
|
/// entry with no "inlined at" element.
|
|
|
|
DenseMap<MDNode*, int> ScopeRecordIdx;
|
|
|
|
|
|
|
|
/// ScopeRecords - These are the actual mdnodes (in a value handle) for an
|
|
|
|
/// index. The ValueHandle ensures that ScopeRecordIdx stays up to date if
|
|
|
|
/// the MDNode is RAUW'd.
|
|
|
|
std::vector<DebugRecVH> ScopeRecords;
|
|
|
|
|
|
|
|
/// ScopeInlinedAtIdx - This is the index in ScopeInlinedAtRecords for an
|
|
|
|
/// scope/inlined-at pair.
|
|
|
|
DenseMap<std::pair<MDNode*, MDNode*>, int> ScopeInlinedAtIdx;
|
|
|
|
|
|
|
|
/// ScopeInlinedAtRecords - These are the actual mdnodes (in value handles)
|
|
|
|
/// for an index. The ValueHandle ensures that ScopeINlinedAtIdx stays up
|
|
|
|
/// to date.
|
|
|
|
std::vector<std::pair<DebugRecVH, DebugRecVH> > ScopeInlinedAtRecords;
|
2014-03-03 20:06:11 +00:00
|
|
|
|
|
|
|
/// DiscriminatorTable - This table maps file:line locations to an
|
|
|
|
/// integer representing the next DWARF path discriminator to assign to
|
|
|
|
/// instructions in different blocks at the same location.
|
|
|
|
DenseMap<std::pair<const char *, unsigned>, unsigned> DiscriminatorTable;
|
|
|
|
|
2013-03-01 18:48:54 +00:00
|
|
|
/// IntrinsicIDCache - Cache of intrinsic name (string) to numeric ID mappings
|
|
|
|
/// requested in this context
|
|
|
|
typedef DenseMap<const Function*, unsigned> IntrinsicIDCacheTy;
|
|
|
|
IntrinsicIDCacheTy IntrinsicIDCache;
|
|
|
|
|
2013-09-16 01:08:15 +00:00
|
|
|
/// \brief Mapping from a function to its prefix data, which is stored as the
|
|
|
|
/// operand of an unparented ReturnInst so that the prefix data has a Use.
|
|
|
|
typedef DenseMap<const Function *, ReturnInst *> PrefixDataMapTy;
|
|
|
|
PrefixDataMapTy PrefixDataMap;
|
|
|
|
|
2014-04-28 18:19:25 +00:00
|
|
|
/// \brief List of listeners to notify about a pass run.
|
|
|
|
SmallVector<PassRunListener *, 4> RunListeners;
|
|
|
|
|
2014-04-08 16:42:38 +00:00
|
|
|
/// \brief Return true if the given pass name should emit optimization
|
|
|
|
/// remarks.
|
|
|
|
bool optimizationRemarksEnabledFor(const char *PassName) const;
|
|
|
|
|
2010-04-01 00:37:44 +00:00
|
|
|
int getOrAddScopeRecordIdxEntry(MDNode *N, int ExistingIdx);
|
|
|
|
int getOrAddScopeInlinedAtIdxEntry(MDNode *Scope, MDNode *IA,int ExistingIdx);
|
2014-04-28 18:19:25 +00:00
|
|
|
|
|
|
|
/// \brief Notify that we finished running a pass.
|
|
|
|
void notifyPassRun(LLVMContext *, Pass *, Module *, Function *, BasicBlock *);
|
|
|
|
/// \brief Register the given PassRunListener to receive notifyPassRun()
|
|
|
|
/// callbacks whenever a pass ran. The context will take ownership of the
|
|
|
|
/// listener and free it when the context is destroyed.
|
|
|
|
void addRunListener(PassRunListener *);
|
|
|
|
/// \brief Unregister a PassRunListener so that it no longer receives
|
|
|
|
/// notifyPassRun() callbacks. Remove and free the listener from the context.
|
|
|
|
void removeRunListener(PassRunListener *);
|
|
|
|
|
2010-03-21 21:17:34 +00:00
|
|
|
LLVMContextImpl(LLVMContext &C);
|
|
|
|
~LLVMContextImpl();
|
2009-06-30 00:48:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2009-06-30 17:06:46 +00:00
|
|
|
#endif
|