[llvm-commits] [llvm] r89176 - in /llvm/trunk: include/llvm/Target/TargetData.h lib/Target/TargetData.cpp

Chris Lattner clattner at apple.com
Tue Dec 1 14:15:35 PST 2009


On Nov 17, 2009, at 5:03 PM, Bill Wendling wrote:

> Author: void
> Date: Tue Nov 17 19:03:56 2009
> New Revision: 89176
>
> URL: http://llvm.org/viewvc/llvm-project?rev=89176&view=rev
> Log:
> The llvm-gcc front-end and the pass manager use two separate  
> TargetData objects.
> This is probably not confined to *just* these two things.

Hi Bill,

This commit message doesn't really make sense to me at all.  I would  
have expected it to be something like "Convert TargetData to use an  
AbstractTypesUser so that it doesn't have dangling pointers when  
abstract types get resolved".


> +++ llvm/trunk/include/llvm/Target/TargetData.h Tue Nov 17 19:03:56  
> 2009
> @@ -30,6 +30,7 @@
> class IntegerType;
> class StructType;
> class StructLayout;
> +class StructLayoutMap;

Why did you publish the StructLayoutMap type?  If you keep it a void*,  
you can put it in an anonymous namespace in the .cpp file.

> +++ llvm/trunk/lib/Target/TargetData.cpp Tue Nov 17 19:03:56 2009
> @@ -323,37 +323,130 @@
>                  : Alignments[BestMatchIdx].PrefAlign;
> }
>
> -typedef DenseMap<const StructType*, StructLayout*>LayoutInfoTy;
> +typedef DenseMap<const StructType*, StructLayout*> LayoutInfoTy;
>
> +namespace llvm {
> +
> +class StructLayoutMap : public AbstractTypeUser {
> +  LayoutInfoTy LayoutInfo;
> +
> +  /// refineAbstractType - The callback method invoked when an  
> abstract type is
> +  /// resolved to another type.  An object must override this  
> method to update
> +  /// its internal state to reference NewType instead of OldType.
> +  ///
> +  virtual void refineAbstractType(const DerivedType *OldTy,
> +                                  const Type *) {
> +    const StructType *STy = dyn_cast<const StructType>(OldTy);
> +    if (!STy) {
> +      OldTy->removeAbstractTypeUser(this);
> +      return;

This should be an error, so you should assert on "STy != 0".  The only  
types this AbstractTypeUser tracks are structs.

> +    }
> +
> +    StructLayout *SL = LayoutInfo[STy];
> +    if (SL) {
> +      SL->~StructLayout();
> +      free(SL);
> +      LayoutInfo[STy] = NULL;

This should use find() instead of [] for two reasons.

1. STy *must* be in the densemap, so this should be an assert that the  
iterator != end.
2. You don't want to set the entry for STy to null, you want to delete  
the entry in the Densemap with erase(iterator).

> +  /// typeBecameConcrete - The other case which AbstractTypeUsers  
> must be aware
> +  /// of is when a type makes the transition from being abstract  
> (where it has
> +  /// clients on its AbstractTypeUsers list) to concrete (where it  
> does not).
> +  /// This method notifies ATU's when this occurs for a type.
> +  ///
> +  virtual void typeBecameConcrete(const DerivedType *AbsTy) {

Same comments as refineAbstractType.

> +  bool insert(const Type *Ty) {
> +    if (Ty->isAbstract())
> +      Ty->addAbstractTypeUser(this);
> +    return true;
> +  }

Just inline this into its one caller.


> +public:
> +  virtual ~StructLayoutMap() {
> +    // Remove any layouts.
> +    for (LayoutInfoTy::iterator
> +           I = LayoutInfo.begin(), E = LayoutInfo.end(); I != E; ++I)
> +      if (StructLayout *SL = I->second) {
> +        SL->~StructLayout();
> +        free(SL);
> +      }

This needs to unregister as listeners from the abstract types!

> +  }
> +
> +  inline LayoutInfoTy::iterator begin() {
> +    return LayoutInfo.begin();
> +  }
> +  inline LayoutInfoTy::iterator end() {
> +    return LayoutInfo.end();
> +  }
> +  inline LayoutInfoTy::const_iterator begin() const {
> +    return LayoutInfo.begin();
> +  }
> +  inline LayoutInfoTy::const_iterator end() const {
> +    return LayoutInfo.end();
> +  }
> +
> +  LayoutInfoTy::iterator find(const StructType *&Val) {
> +    return LayoutInfo.find(Val);
> +  }
> +  LayoutInfoTy::const_iterator find(const StructType *&Val) const {
> +    return LayoutInfo.find(Val);
> +  }
> +
> +  bool erase(const StructType *&Val) {
> +    return LayoutInfo.erase(Val);
> +  }
> +  bool erase(LayoutInfoTy::iterator I) {
> +    return LayoutInfo.erase(I);
> +  }

This stuff is all dead.  Please remove it.

> +
> +  StructLayout *&operator[](const Type *Key) {

Key should be declared as 'const StructType *'.

> +    const StructType *STy = dyn_cast<const StructType>(Key);
> +    assert(STy && "Trying to access the struct layout map with a  
> non-struct!");
which allows you to eliminate this.

> +    insert(STy);
> +    return LayoutInfo[STy];

Don't do a redundant map lookup after 'insert'.

-Chris



More information about the llvm-commits mailing list