summaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2001-07-21 12:42:08 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2001-07-21 12:42:08 +0000
commitdaae69927f2fe65b15cf68fbbc4c6099e2afc009 (patch)
tree8a903a0de8bfba523c14e525b08abce6fd3883c2 /lib/CodeGen
parent70bc4b5d1a3795a8f41be96723cfcbccac8e1671 (diff)
downloadllvm-daae69927f2fe65b15cf68fbbc4c6099e2afc009.tar.gz
llvm-daae69927f2fe65b15cf68fbbc4c6099e2afc009.tar.bz2
llvm-daae69927f2fe65b15cf68fbbc4c6099e2afc009.tar.xz
Base clas for a description of a target architecture.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/TargetMachine/Makefile11
-rw-r--r--lib/CodeGen/TargetMachine/TargetMachine.cpp114
2 files changed, 125 insertions, 0 deletions
diff --git a/lib/CodeGen/TargetMachine/Makefile b/lib/CodeGen/TargetMachine/Makefile
new file mode 100644
index 0000000000..ee3d21786f
--- /dev/null
+++ b/lib/CodeGen/TargetMachine/Makefile
@@ -0,0 +1,11 @@
+LEVEL = ../../..
+
+DIRS = Sparc
+
+LIBRARYNAME = target
+
+## List source files in link order
+Source = \
+ TargetMachine.o
+
+include $(LEVEL)/Makefile.common
diff --git a/lib/CodeGen/TargetMachine/TargetMachine.cpp b/lib/CodeGen/TargetMachine/TargetMachine.cpp
new file mode 100644
index 0000000000..544f742062
--- /dev/null
+++ b/lib/CodeGen/TargetMachine/TargetMachine.cpp
@@ -0,0 +1,114 @@
+// $Id$
+//***************************************************************************
+// File:
+// TargetMachine.cpp
+//
+// Purpose:
+//
+// History:
+// 7/12/01 - Vikram Adve - Created
+//**************************************************************************/
+
+
+//************************** System Include Files **************************/
+
+//*************************** User Include Files ***************************/
+
+#include "llvm/DerivedTypes.h"
+#include "llvm/Codegen/TargetMachine.h"
+
+
+//************************* Opaque Declarations ****************************/
+
+class StructType;
+class MachineInstrInfo;
+
+
+//************************ Class Implementations **************************/
+
+
+//---------------------------------------------------------------------------
+// function TargetMachine::findOptimalMemberOffsets
+//
+// Purpose:
+// Compute optimal offsets for the members of a structure.
+// Returns a vector of unsigned ints, one per member.
+// Caller is responsible for freeing the vector.
+//---------------------------------------------------------------------------
+
+unsigned int
+TargetMachine::findOptimalStorageSize(const Type* ty) const
+{
+ switch(ty->getPrimitiveID())
+ {
+ case Type::BoolTyID:
+ case Type::UByteTyID: case Type::SByteTyID:
+ case Type::UShortTyID: case Type::ShortTyID:
+ return optSizeForSubWordData;
+ break;
+
+ case Type::UIntTyID: case Type::IntTyID:
+ return intSize;
+ break;
+
+ case Type::FloatTyID:
+ return floatSize;
+ break;
+
+ case Type::ULongTyID: case Type::LongTyID:
+ return longSize;
+ break;
+
+ case Type::DoubleTyID:
+ return doubleSize;
+ break;
+
+ case Type::PointerTyID:
+ case Type::LabelTyID: case Type::MethodTyID:
+ return pointerSize;
+ break;
+
+ case Type::ArrayTyID:
+ {
+ ArrayType* aty = (ArrayType*) ty;
+ assert(aty->getNumElements() >= 0 &&
+ "Attempting to compute size for unknown-size array");
+ return (unsigned) aty->getNumElements() *
+ this->findOptimalStorageSize(aty->getElementType());
+ break;
+ }
+
+ case Type::StructTyID:
+ {// This code should be invoked only from StructType::getStorageSize().
+ StructType* sty = (StructType*) ty;
+ unsigned lastMemberIdx = sty->getElementTypes().size() - 1;
+ unsigned lastMemberOffset = sty->getElementOffset(lastMemberIdx, *this);
+ unsigned storageSize = lastMemberOffset
+ + this->findOptimalStorageSize(sty->getElementTypes()[lastMemberIdx]);
+ return storageSize;
+ break;
+ }
+
+ default:
+ assert(0 && "Unexpected type in `findOptimalStorageSize'");
+ return 0;
+ break;
+ }
+}
+
+unsigned int*
+TargetMachine::findOptimalMemberOffsets(const StructType* stype) const
+{
+ int numMembers = stype->getElementTypes().size();
+ unsigned int* offsetVec = new unsigned int[numMembers];
+ unsigned int netOffset = 0;
+ for (int i = 0; i < numMembers; i++)
+ {
+ offsetVec[i] = netOffset;
+ const Type* memberType = stype->getElementTypes()[i];
+ netOffset += this->findOptimalStorageSize(memberType);
+ }
+ return offsetVec;
+}
+
+//---------------------------------------------------------------------------