Use MachineBasicBlock::transferSuccessors.
[oota-llvm.git] / include / llvm / Target / TargetData.h
index 5756079c40f28739b31e8b8a3fdbb505d8a30e56..2d9dc076e2ffe90f03a4574abf9755fa66a3a953 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -38,7 +38,8 @@ enum AlignTypeEnum {
   INTEGER_ALIGN = 'i',               ///< Integer type alignment
   VECTOR_ALIGN = 'v',                ///< Vector type alignment
   FLOAT_ALIGN = 'f',                 ///< Floating point type alignment
-  AGGREGATE_ALIGN = 'a'              ///< Aggregate alignment
+  AGGREGATE_ALIGN = 'a',             ///< Aggregate alignment
+  STACK_ALIGN = 's'                  ///< Stack objects alignment
 };
 /// Target alignment element.
 ///
@@ -91,7 +92,7 @@ private:
   void setAlignment(AlignTypeEnum align_type, unsigned char abi_align,
                     unsigned char pref_align, uint32_t bit_width);
   unsigned getAlignmentInfo(AlignTypeEnum align_type, uint32_t bit_width,
-                            bool ABIAlign) const;
+                            bool ABIAlign, const Type *Ty) const;
   //! Internal helper method that returns requested alignment for type.
   unsigned char getAlignment(const Type *Ty, bool abi_or_pref) const;
 
@@ -108,23 +109,23 @@ public:
   ///
   /// @note This has to exist, because this is a pass, but it should never be
   /// used.
-  TargetData() : ImmutablePass((intptr_t)&ID) {
+  TargetData() : ImmutablePass(intptr_t(&ID)) {
     assert(0 && "ERROR: Bad TargetData ctor used.  "
            "Tool did not specify a TargetData to use?");
     abort();
   }
     
   /// Constructs a TargetData from a specification string. See init().
-  TargetData(const std::string &TargetDescription) 
-    : ImmutablePass((intptr_t)&ID) {
+  explicit TargetData(const std::string &TargetDescription) 
+    : ImmutablePass(intptr_t(&ID)) {
     init(TargetDescription);
   }
 
   /// Initialize target data from properties stored in the module.
-  TargetData(const Module *M);
+  explicit TargetData(const Module *M);
 
   TargetData(const TargetData &TD) : 
-    ImmutablePass((intptr_t)&ID),
+    ImmutablePass(intptr_t(&ID)),
     LittleEndian(TD.isLittleEndian()),
     PointerMemSize(TD.PointerMemSize),
     PointerABIAlign(TD.PointerABIAlign),
@@ -154,20 +155,52 @@ public:
   /// Target pointer size, in bits
   unsigned char getPointerSizeInBits()   const { return 8*PointerMemSize; }
 
-  /// getTypeSize - Return the number of bytes necessary to hold the specified
-  /// type.
-  uint64_t getTypeSize(const Type *Ty) const;
-
   /// getTypeSizeInBits - Return the number of bits necessary to hold the
-  /// specified type.
+  /// specified type.  For example, returns 36 for i36 and 80 for x86_fp80.
   uint64_t getTypeSizeInBits(const Type* Ty) const;
 
+  /// getTypeStoreSize - Return the maximum number of bytes that may be
+  /// overwritten by storing the specified type.  For example, returns 5
+  /// for i36 and 10 for x86_fp80.
+  uint64_t getTypeStoreSize(const Type *Ty) const {
+    return (getTypeSizeInBits(Ty)+7)/8;
+  }
+
+  /// getTypeStoreSizeInBits - Return the maximum number of bits that may be
+  /// overwritten by storing the specified type; always a multiple of 8.  For
+  /// example, returns 40 for i36 and 80 for x86_fp80.
+  uint64_t getTypeStoreSizeInBits(const Type *Ty) const {
+    return 8*getTypeStoreSize(Ty);
+  }
+
+  /// getABITypeSize - Return the offset in bytes between successive objects
+  /// of the specified type, including alignment padding.  This is the amount
+  /// that alloca reserves for this type.  For example, returns 12 or 16 for
+  /// x86_fp80, depending on alignment.
+  uint64_t getABITypeSize(const Type* Ty) const {
+    unsigned char Align = getABITypeAlignment(Ty);
+    return (getTypeStoreSize(Ty) + Align - 1)/Align*Align;
+  }
+
+  /// getABITypeSizeInBits - Return the offset in bits between successive
+  /// objects of the specified type, including alignment padding; always a
+  /// multiple of 8.  This is the amount that alloca reserves for this type.
+  /// For example, returns 96 or 128 for x86_fp80, depending on alignment.
+  uint64_t getABITypeSizeInBits(const Type* Ty) const {
+    return 8*getABITypeSize(Ty);
+  }
+
   /// getABITypeAlignment - Return the minimum ABI-required alignment for the
   /// specified type.
   unsigned char getABITypeAlignment(const Type *Ty) const;
 
+  /// getCallFrameTypeAlignment - Return the minimum ABI-required alignment
+  /// for the specified type when it is part of a call frame.
+  unsigned char getCallFrameTypeAlignment(const Type *Ty) const;
+
+
   /// getPrefTypeAlignment - Return the preferred stack/global alignment for
-  /// the specified type.
+  /// the specified type.  This is always at least as good as the ABI alignment.
   unsigned char getPrefTypeAlignment(const Type *Ty) const;
 
   /// getPreferredTypeAlignmentShift - Return the preferred alignment for the
@@ -197,6 +230,11 @@ public:
   /// avoid a dangling pointer in this cache.
   void InvalidateStructLayoutInfo(const StructType *Ty) const;
 
+  /// getPreferredAlignment - Return the preferred alignment of the specified
+  /// global.  This includes an explicitly requested alignment (if the global
+  /// has one).
+  unsigned getPreferredAlignment(const GlobalVariable *GV) const;
+
   /// getPreferredAlignmentLog - Return the preferred alignment of the
   /// specified global, returned in log form.  This includes an explicitly
   /// requested alignment (if the global has one).
@@ -219,6 +257,10 @@ public:
     return StructSize;
   }
   
+  uint64_t getSizeInBits() const {
+    return 8*StructSize;
+  }
+
   unsigned getAlignment() const {
     return StructAlignment;
   }
@@ -232,7 +274,11 @@ public:
     assert(Idx < NumElements && "Invalid element idx!");
     return MemberOffsets[Idx];
   }
-  
+
+  uint64_t getElementOffsetInBits(unsigned Idx) const {
+    return getElementOffset(Idx)*8;
+  }
+
 private:
   friend class TargetData;   // Only TargetData can create this class
   StructLayout(const StructType *ST, const TargetData &TD);