diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2001-07-21 12:42:08 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2001-07-21 12:42:08 +0000 |
commit | daae69927f2fe65b15cf68fbbc4c6099e2afc009 (patch) | |
tree | 8a903a0de8bfba523c14e525b08abce6fd3883c2 | |
parent | 70bc4b5d1a3795a8f41be96723cfcbccac8e1671 (diff) | |
download | external_llvm-daae69927f2fe65b15cf68fbbc4c6099e2afc009.zip external_llvm-daae69927f2fe65b15cf68fbbc4c6099e2afc009.tar.gz external_llvm-daae69927f2fe65b15cf68fbbc4c6099e2afc009.tar.bz2 |
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
-rw-r--r-- | lib/CodeGen/TargetMachine/Makefile | 11 | ||||
-rw-r--r-- | lib/CodeGen/TargetMachine/TargetMachine.cpp | 114 |
2 files changed, 125 insertions, 0 deletions
diff --git a/lib/CodeGen/TargetMachine/Makefile b/lib/CodeGen/TargetMachine/Makefile new file mode 100644 index 0000000..ee3d217 --- /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 0000000..544f742 --- /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; +} + +//--------------------------------------------------------------------------- |