[llvm-commits] CVS: llvm/include/llvm/Target/TargetData.h

Chris Lattner clattner at apple.com
Tue Feb 13 22:01:01 PST 2007


On Feb 13, 2007, at 9:52 PM, Chris Lattner wrote:
> Generalize TargetData strings, to support more interesting forms of  
> data.
> Patch by Scott Michel.

Scott,

> Index: llvm/include/llvm/Target/TargetData.h
> diff -u llvm/include/llvm/Target/TargetData.h:1.53 llvm/include/ 
> llvm/Target/TargetData.h:1.54
> --- llvm/include/llvm/Target/TargetData.h:1.53	Sat Feb 10 14:37:40  
> 2007
> +++ llvm/include/llvm/Target/TargetData.h	Tue Feb 13 23:52:16 2007
> @@ -22,6 +22,8 @@
>
>  #include "llvm/Pass.h"
>  #include "llvm/Support/DataTypes.h"
> +#include "llvm/ADT/SmallVector.h"
> +#include <string>
>
>  namespace llvm {
>
> @@ -31,45 +33,96 @@
>  class StructLayout;
>  class GlobalVariable;
>
> -class TargetData : public ImmutablePass {
> -  bool          LittleEndian;          // Defaults to false
> +/// Enum used to categorize the alignment types stored by  
> TargetAlignElem
> +enum AlignTypeEnum {
> +  INTEGER_ALIGN = 'i',               ///< Integer type alignment
> +  PACKED_ALIGN = 'v',                ///< Vector type alignment
> +  FLOAT_ALIGN = 'f',                 ///< Floating point type  
> alignment
> +  AGGREGATE_ALIGN = 'a'              ///< Aggregate alignment
> +};
> +/// Target alignment element.
> +///
> +/// Stores the alignment data associated with a given alignment  
> type (pointer,
> +/// integer, packed/vector, float) and type bit width.
> +///
> +/// @note The unusual order of elements in the structure attempts  
> to reduce
> +/// padding and make the structure slightly more cache friendly.
> +struct TargetAlignElem {
> +  unsigned char       AlignType;      //< Alignment type  
> (AlignTypeEnum)

This should be:

   AlignTypeEnum AlignType : 8;

> +  unsigned char       ABIAlign;       //< ABI alignment for this  
> type/bitw
> +  unsigned char       PrefAlign;      //< Pref. alignment for this  
> type/bitw
> +  short               TypeBitWidth;   //< Type bit width
> +
> +  /// Initializer
> +  static TargetAlignElem get(AlignTypeEnum align_type, unsigned  
> char abi_align,
> +                             unsigned char pref_align, short  
> bit_width);
> +  /// Less-than predicate
> +  bool operator<(const TargetAlignElem &rhs) const;
> +  /// Equality predicate
> +  bool operator==(const TargetAlignElem &rhs) const;
> +  /// output stream operator
> +  std::ostream &dump(std::ostream &os) const;
> +};
>
> -  // ABI alignments
> -  unsigned char BoolABIAlignment;       // Defaults to 1 byte
> -  unsigned char ByteABIAlignment;       // Defaults to 1 byte
> -  unsigned char ShortABIAlignment;      // Defaults to 2 bytes
> -  unsigned char IntABIAlignment;        // Defaults to 4 bytes
> -  unsigned char LongABIAlignment;       // Defaults to 8 bytes
> -  unsigned char FloatABIAlignment;      // Defaults to 4 bytes
> -  unsigned char DoubleABIAlignment;     // Defaults to 8 bytes
> -  unsigned char PointerMemSize;        // Defaults to 8 bytes
> -  unsigned char PointerABIAlignment;    // Defaults to 8 bytes
> -
> -  // Preferred stack/global type alignments
> -  unsigned char BoolPrefAlignment;    // Defaults to BoolABIAlignment
> -  unsigned char BytePrefAlignment;    // Defaults to ByteABIAlignment
> -  unsigned char ShortPrefAlignment;   // Defaults to  
> ShortABIAlignment
> -  unsigned char IntPrefAlignment;     // Defaults to IntABIAlignment
> -  unsigned char LongPrefAlignment;    // Defaults to LongABIAlignment
> -  unsigned char FloatPrefAlignment;   // Defaults to  
> FloatABIAlignment
> -  unsigned char DoublePrefAlignment;  // Defaults to  
> DoubleABIAlignment
> -  unsigned char PointerPrefAlignment; // Defaults to  
> PointerABIAlignment
> -  unsigned char AggMinPrefAlignment;  // Defaults to 0 bytes
> +//! TargetAlignElem output stream inserter
> +/*!
> +  @sa TargetAlignElem::dump()
> + */
> +std::ostream &operator<<(std::ostream &os, const TargetAlignElem  
> &elem);
> +
> +class TargetData : public ImmutablePass {
> +private:
> +  bool          LittleEndian;          ///< Defaults to false
> +  unsigned char PointerMemSize;        ///< Pointer size in bytes
> +  unsigned char PointerABIAlign;       ///< Pointer ABI alignment
> +  unsigned char PointerPrefAlign;      ///< Pointer preferred  
> global alignment

'Pointer preferred global alignment' ?

global what?

> +
> +  //! Where the primitive type alignment data is stored.
> +  /*!
> +   @sa init().
> +   @note Could support multiple size pointer alignments, e.g., 32- 
> bit pointers
> +   vs. 64-bit pointers by extending TargetAlignment, but for now,  
> we don't.
> +   */
> +  SmallVector<TargetAlignElem, 16> Alignments;
> +  //! Alignment iterator shorthand
> +  typedef SmallVector<TargetAlignElem, 16>::iterator align_iterator;

I don't think the elements in 'Alignments' should ever be mutable  
through iterators.  I'd suggest using:
   typedef SmallVector<TargetAlignElem, 16>::const_iterator  
align_iterator;



> +  //! Invalid alignment.
> +  /*!
> +    This member is a signal that a requested alignment type and  
> bit width were
> +    not found in the SmallVector.
> +   */
> +  static const TargetAlignElem InvalidAlignmentElem;
> +
> +  //! Set/initialize target alignments
> +  void setAlignment(AlignTypeEnum align_type, unsigned char  
> abi_align,
> +                    unsigned char pref_align, short bit_width);
> +  //! Get TargetAlignElem from alignment type and bit width
> +  const TargetAlignElem &getAlignment(AlignTypeEnum, short) const;

Please give these arguments names to indicate what they are.

> +  //! Internal helper method that returns requested alignment for  
> type.
> +  unsigned char getAlignment(const Type *Ty, bool abi_or_pref) const;

abi_or_pref doesn't indicate what 'true' means.  Should this be an  
enum with two values?

> -  /// Parse a target data layout string and initialize TargetData  
> members.
> -  ///
> -  /// Parse a target data layout string, initializing the various  
> TargetData
> -  /// members along the way. A TargetData specification string  
> looks like
> -  /// "E-p:64:64-d:64-f:32-l:64-i:32-s:16-b:8-B:8" and specifies the
> -  /// target's endianess, the ABI alignments of various data types  
> and
> -  /// the size of pointers.

The format of this string should be described somewhere.  Perhaps in  
LangRef.html?

-Chris




More information about the llvm-commits mailing list