[llvm-commits] [llvm] r79555 - in /llvm/trunk: include/llvm/Target/TargetData.h lib/Target/TargetData.cpp
Bill Wendling
wendling at apple.com
Thu Aug 20 15:05:06 PDT 2009
Hi Owen,
This was most likely causing build bot and nightly test failures.
Could you please look into it?
-bw
On Aug 20, 2009, at 11:26 AM, Owen Anderson wrote:
> Author: resistor
> Date: Thu Aug 20 13:26:03 2009
> New Revision: 79555
>
> URL: http://llvm.org/viewvc/llvm-project?rev=79555&view=rev
> Log:
> Make the StructType->StructLayout table private to TargetData,
> allowing us to avoid locking on it.
>
> Modified:
> llvm/trunk/include/llvm/Target/TargetData.h
> llvm/trunk/lib/Target/TargetData.cpp
>
> Modified: llvm/trunk/include/llvm/Target/TargetData.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetData.h?rev=79555&r1=79554&r2=79555&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/Target/TargetData.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetData.h Thu Aug 20 13:26:03
> 2009
> @@ -91,6 +91,9 @@
> */
> static const TargetAlignElem InvalidAlignmentElem;
>
> + /// Opaque pointer for the StructType -> StructLayout map
> + void* LayoutMap;
> +
> //! Set/initialize target alignments
> void setAlignment(AlignTypeEnum align_type, unsigned char abi_align,
> unsigned char pref_align, uint32_t bit_width);
> @@ -107,6 +110,9 @@
> return (&align != &InvalidAlignmentElem);
> }
>
> + // DO NOT IMPLEMENT
> + void operator=(const TargetData&);
> +
> public:
> /// Default ctor.
> ///
> @@ -118,22 +124,11 @@
> }
>
> /// Constructs a TargetData from a specification string. See init().
> - explicit TargetData(const std::string &TargetDescription)
> - : ImmutablePass(&ID) {
> - init(TargetDescription);
> - }
> + explicit TargetData(const std::string &TargetDescription);
>
> /// Initialize target data from properties stored in the module.
> explicit TargetData(const Module *M);
> -
> - TargetData(const TargetData &TD) :
> - ImmutablePass(&ID),
> - LittleEndian(TD.isLittleEndian()),
> - PointerMemSize(TD.PointerMemSize),
> - PointerABIAlign(TD.PointerABIAlign),
> - PointerPrefAlign(TD.PointerPrefAlign),
> - Alignments(TD.Alignments)
> - { }
> + TargetData(const TargetData &TD);
>
> ~TargetData(); // Not virtual, do not subclass this class
>
>
> Modified: llvm/trunk/lib/Target/TargetData.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetData.cpp?rev=79555&r1=79554&r2=79555&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Target/TargetData.cpp (original)
> +++ llvm/trunk/lib/Target/TargetData.cpp Thu Aug 20 13:26:03 2009
> @@ -24,7 +24,6 @@
> #include "llvm/Support/MathExtras.h"
> #include "llvm/Support/ManagedStatic.h"
> #include "llvm/Support/ErrorHandling.h"
> -#include "llvm/System/Mutex.h"
> #include "llvm/ADT/DenseMap.h"
> #include "llvm/ADT/StringExtras.h"
> #include <algorithm>
> @@ -132,6 +131,8 @@
> // TargetData Class Implementation
> //
> =
> =
> =
> ----------------------------------------------------------------------=
> ==//
>
> +typedef DenseMap<const StructType*, StructLayout*> LayoutInfoTy;
> +
> /*!
> A TargetDescription string consists of a sequence of hyphen-delimited
> specifiers for target endianness, pointer size and alignments, and
> various
> @@ -170,6 +171,7 @@
> alignment will be used.
> */
> void TargetData::init(const std::string &TargetDescription) {
> + LayoutMap = static_cast<void*>(new LayoutInfoTy());
> std::string temp = TargetDescription;
>
> LittleEndian = false;
> @@ -234,11 +236,28 @@
> }
> }
>
> +TargetData::TargetData(const std::string &TargetDescription)
> + : ImmutablePass(&ID) {
> + init(TargetDescription);
> +}
> +
> TargetData::TargetData(const Module *M)
> : ImmutablePass(&ID) {
> init(M->getDataLayout());
> }
>
> +TargetData::TargetData(const TargetData &TD) :
> + ImmutablePass(&ID),
> + LittleEndian(TD.isLittleEndian()),
> + PointerMemSize(TD.PointerMemSize),
> + PointerABIAlign(TD.PointerABIAlign),
> + PointerPrefAlign(TD.PointerPrefAlign),
> + Alignments(TD.Alignments) {
> + LayoutInfoTy *Other = static_cast<LayoutInfoTy*>(TD.LayoutMap);
> + LayoutMap = static_cast<void*>(new LayoutInfoTy(*Other));
> +}
> +
> +
> void
> TargetData::setAlignment(AlignTypeEnum align_type, unsigned char
> abi_align,
> unsigned char pref_align, uint32_t
> bit_width) {
> @@ -317,61 +336,26 @@
> : Alignments[BestMatchIdx].PrefAlign;
> }
>
> -namespace {
> -
> -/// LayoutInfo - The lazy cache of structure layout information
> maintained by
> -/// TargetData. Note that the struct types must have been free'd
> before
> -/// llvm_shutdown is called (and thus this is deallocated) because
> all the
> -/// targets with cached elements should have been destroyed.
> -///
> -typedef std::pair<const TargetData*,const StructType*> LayoutKey;
> -
> -struct DenseMapLayoutKeyInfo {
> - static inline LayoutKey getEmptyKey() { return LayoutKey(0, 0); }
> - static inline LayoutKey getTombstoneKey() {
> - return LayoutKey((TargetData*)(intptr_t)-1, 0);
> - }
> - static unsigned getHashValue(const LayoutKey &Val) {
> - return DenseMapInfo<void*>::getHashValue(Val.first) ^
> - DenseMapInfo<void*>::getHashValue(Val.second);
> - }
> - static bool isEqual(const LayoutKey &LHS, const LayoutKey &RHS) {
> - return LHS == RHS;
> - }
> -
> - static bool isPod() { return true; }
> -};
> -
> -typedef DenseMap<LayoutKey, StructLayout*, DenseMapLayoutKeyInfo>
> LayoutInfoTy;
> -
> -}
> -
> -static ManagedStatic<LayoutInfoTy> LayoutInfo;
> -static ManagedStatic<sys::SmartMutex<true> > LayoutLock;
> -
> TargetData::~TargetData() {
> - if (!LayoutInfo.isConstructed())
> - return;
> -
> - sys::SmartScopedLock<true> Lock(*LayoutLock);
> + assert(LayoutMap && "LayoutMap not initialized?");
> + LayoutInfoTy &TheMap = *static_cast<LayoutInfoTy*>(LayoutMap);
> +
> // Remove any layouts for this TD.
> - LayoutInfoTy &TheMap = *LayoutInfo;
> for (LayoutInfoTy::iterator I = TheMap.begin(), E = TheMap.end();
> I != E; ) {
> - if (I->first.first == this) {
> - I->second->~StructLayout();
> - free(I->second);
> - TheMap.erase(I++);
> - } else {
> - ++I;
> - }
> + I->second->~StructLayout();
> + free(I->second);
> + TheMap.erase(I++);
> }
> +
> + delete static_cast<LayoutInfoTy*>(LayoutMap);
> + LayoutMap = 0;
> }
>
> const StructLayout *TargetData::getStructLayout(const StructType
> *Ty) const {
> - LayoutInfoTy &TheMap = *LayoutInfo;
> + assert(LayoutMap && "LayoutMap not initialized?");
> + LayoutInfoTy &TheMap = *static_cast<LayoutInfoTy*>(LayoutMap);
>
> - sys::SmartScopedLock<true> Lock(*LayoutLock);
> - StructLayout *&SL = TheMap[LayoutKey(this, Ty)];
> + StructLayout *&SL = TheMap[Ty];
> if (SL) return SL;
>
> // Otherwise, create the struct layout. Because it is variable
> length, we
> @@ -393,10 +377,9 @@
> /// removed, this method must be called whenever a StructType is
> removed to
> /// avoid a dangling pointer in this cache.
> void TargetData::InvalidateStructLayoutInfo(const StructType *Ty)
> const {
> - if (!LayoutInfo.isConstructed()) return; // No cache.
> -
> - sys::SmartScopedLock<true> Lock(*LayoutLock);
> - LayoutInfoTy::iterator I = LayoutInfo->find(LayoutKey(this, Ty));
> + assert(LayoutMap && "LayoutMap not initialized?");
> + LayoutInfoTy *LayoutInfo = static_cast<LayoutInfoTy*>(LayoutMap);
> + LayoutInfoTy::iterator I = LayoutInfo->find(Ty);
> if (I == LayoutInfo->end()) return;
>
> I->second->~StructLayout();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list