Privatize StructLayout::MemberOffsets, adding an accessor
authorChris Lattner <sabre@nondot.org>
Sat, 10 Feb 2007 19:55:17 +0000 (19:55 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 10 Feb 2007 19:55:17 +0000 (19:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34156 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetData.h
lib/Analysis/ConstantFolding.cpp
lib/CodeGen/AsmPrinter.cpp
lib/CodeGen/MachOWriter.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
lib/ExecutionEngine/ExecutionEngine.cpp
lib/ExecutionEngine/Interpreter/Execution.cpp
lib/Target/TargetData.cpp
lib/Transforms/Scalar/LoopStrengthReduce.cpp
lib/Transforms/Scalar/ScalarReplAggregates.cpp

index d577de7c8a04588ae0a7a42ceda3efdb9c489d2e..516aae700d859899f8001359889404a49558dabd 100644 (file)
@@ -275,16 +275,21 @@ public:
 /// target machine, based on the TargetData structure.
 ///
 class StructLayout {
-public:
   std::vector<uint64_t> MemberOffsets;
-  uint64_t StructSize;
+public:
   unsigned StructAlignment;
+  uint64_t StructSize;
 
   /// getElementContainingOffset - Given a valid offset into the structure,
   /// return the structure index that contains it.
   ///
   unsigned getElementContainingOffset(uint64_t Offset) const;
 
+  uint64_t getElementOffset(unsigned Idx) const {
+    assert(Idx < MemberOffsets.size() && "Invalid element idx!");
+    return MemberOffsets[Idx];
+  }
+  
 private:
   friend class TargetData;   // Only TargetData can create this class
   StructLayout(const StructType *ST, const TargetData &TD);
index 25a64ab9a68cb938573b140ff6c2681b8f680b67..1515301a77a6f2dbe07d610bf4ccf22f6480f40e 100644 (file)
@@ -70,7 +70,7 @@ static bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
       
       if (const StructType *ST = dyn_cast<StructType>(*GTI)) {
         // N = N + Offset
-        Offset += TD.getStructLayout(ST)->MemberOffsets[CI->getZExtValue()];
+        Offset += TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue());
       } else {
         const SequentialType *ST = cast<SequentialType>(*GTI);
         Offset += TD.getTypeSize(ST->getElementType())*CI->getSExtValue();
index 0394a02aa16bd2adee1be9fc11090eccf0372f9c..6dac1ea3759ffc585b811f591e96a0c1a91157cd 100644 (file)
@@ -739,8 +739,8 @@ void AsmPrinter::EmitGlobalConstant(const Constant *CV) {
       // Check if padding is needed and insert one or more 0s.
       uint64_t fieldSize = TD->getTypeSize(field->getType());
       uint64_t padSize = ((i == e-1? cvsLayout->StructSize
-                           : cvsLayout->MemberOffsets[i+1])
-                          - cvsLayout->MemberOffsets[i]) - fieldSize;
+                           : cvsLayout->getElementOffset(i+1))
+                          - cvsLayout->getElementOffset(i)) - fieldSize;
       sizeSoFar += fieldSize + padSize;
 
       // Now print the actual field value
index 3beb11a25f21b2fbeb0015b8777743b212cda0bc..384dd3ee54771aae135340794757b87e24d56fd0 100644 (file)
@@ -878,7 +878,8 @@ void MachOWriter::InitMem(const Constant *C, void *Addr, intptr_t Offset,
       const StructLayout *SL =
         TD->getStructLayout(cast<StructType>(CPS->getType()));
       for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
-        WorkList.push_back(CPair(CPS->getOperand(i), PA+SL->MemberOffsets[i]));
+        WorkList.push_back(CPair(CPS->getOperand(i),
+                                 PA+SL->getElementOffset(i)));
     } else {
       cerr << "Bad Type: " << *PC->getType() << "\n";
       assert(0 && "Unknown constant type to initialize memory with!");
index ae7a495bf48665b2e89c5d54fe3c702b7aa7ae63..16d25ee2259661c1fbca34d454f0f08c53089953 100644 (file)
@@ -1678,7 +1678,7 @@ void SelectionDAGLowering::visitGetElementPtr(User &I) {
       unsigned Field = cast<ConstantInt>(Idx)->getZExtValue();
       if (Field) {
         // N = N + Offset
-        uint64_t Offset = TD->getStructLayout(StTy)->MemberOffsets[Field];
+        uint64_t Offset = TD->getStructLayout(StTy)->getElementOffset(Field);
         N = DAG.getNode(ISD::ADD, N.getValueType(), N,
                         getIntPtrConstant(Offset));
       }
@@ -3702,7 +3702,7 @@ static bool OptimizeGEPExpression(GetElementPtrInst *GEPI,
     if (const StructType *StTy = dyn_cast<StructType>(Ty)) {
       unsigned Field = cast<ConstantInt>(Idx)->getZExtValue();
       if (Field)
-        ConstantOffset += TD->getStructLayout(StTy)->MemberOffsets[Field];
+        ConstantOffset += TD->getStructLayout(StTy)->getElementOffset(Field);
       Ty = StTy->getElementType(Field);
     } else {
       Ty = cast<SequentialType>(Ty)->getElementType();
index 0fd6d461e1f6bf5d626320428d3ed214670d64e7..6878f89fffb95b58908fb0d564b94fd76c7c8b77 100644 (file)
@@ -716,7 +716,7 @@ void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
     const StructLayout *SL =
       getTargetData()->getStructLayout(cast<StructType>(CPS->getType()));
     for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
-      InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->MemberOffsets[i]);
+      InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
     return;
   }
 
index fe80dfddd63768afef976d5e49230884b8360edd..936d64f444138c614b50f8f1d18da17d04f6061b 100644 (file)
@@ -1082,7 +1082,7 @@ GenericValue Interpreter::executeGEPOperation(Value *Ptr, gep_type_iterator I,
       const ConstantInt *CPU = cast<ConstantInt>(I.getOperand());
       unsigned Index = unsigned(CPU->getZExtValue());
 
-      Total += (PointerTy)SLO->MemberOffsets[Index];
+      Total += (PointerTy)SLO->getElementOffset(Index);
     } else {
       const SequentialType *ST = cast<SequentialType>(*I);
       // Get the index number for the array... which must be long type...
index 41288ec6713d00e290f6d378c58e9edb17e7f270..1ebe5b5711eaf5386045e98c84db57753a971ad4 100644 (file)
@@ -466,8 +466,7 @@ uint64_t TargetData::getIndexedOffset(const Type *ptrTy, Value* const* Indices,
       const StructLayout *Layout = getStructLayout(STy);
 
       // Add in the offset, as calculated by the structure layout info...
-      assert(FieldNo < Layout->MemberOffsets.size() &&"FieldNo out of range!");
-      Result += Layout->MemberOffsets[FieldNo];
+      Result += Layout->getElementOffset(FieldNo);
 
       // Update Ty to refer to current element
       Ty = STy->getElementType(FieldNo);
index d841642de054d82b06d6711848584925c719f6f5..e97921237fcecb1bd5d76006e829160efbfb4203 100644 (file)
@@ -267,7 +267,7 @@ SCEVHandle LoopStrengthReduce::GetExpressionSCEV(Instruction *Exp, Loop *L) {
     if (const StructType *STy = dyn_cast<StructType>(*GTI)) {
       const StructLayout *SL = TD->getStructLayout(STy);
       unsigned Idx = cast<ConstantInt>(GEP->getOperand(i))->getZExtValue();
-      uint64_t Offset = SL->MemberOffsets[Idx];
+      uint64_t Offset = SL->getElementOffset(Idx);
       GEPVal = SCEVAddExpr::get(GEPVal,
                                 SCEVUnknown::getIntegerSCEV(Offset, UIntPtrTy));
     } else {
index 6b99bc899bf17c86ef546bdd528763e9537290d7..016a421945d3fd9e047c9afa0e457e482aaa56c7 100644 (file)
@@ -801,7 +801,8 @@ void SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset) {
           else
             NewOffset += AggSizeInBits-ElSizeBits*(Idx+1);
         } else if (const StructType *STy = dyn_cast<StructType>(AggTy)) {
-          unsigned EltBitOffset = TD.getStructLayout(STy)->MemberOffsets[Idx]*8;
+          unsigned EltBitOffset =
+            TD.getStructLayout(STy)->getElementOffset(Idx)*8;
           
           if (TD.isLittleEndian() || isVectorInsert)
             NewOffset += EltBitOffset;