aboutsummaryrefslogtreecommitdiff
path: root/lib/VMCore/Module.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2006-05-18 02:10:31 +0000
committerOwen Anderson <resistor@mac.com>2006-05-18 02:10:31 +0000
commit1d8b8535ec6ccbf07b0e83c5be6aec51feed1d45 (patch)
treef604b53c5dab141a02d6c778b5fd19309dc319a3 /lib/VMCore/Module.cpp
parent0f3ac8d8d4ce23eb2ae6f9d850f389250874eea5 (diff)
Change Module to use TargetData-compatible strings internally.
This is part of the on-going work on PR 761. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28379 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Module.cpp')
-rw-r--r--lib/VMCore/Module.cpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp
index 7c400aa515..9fdc13ddb6 100644
--- a/lib/VMCore/Module.cpp
+++ b/lib/VMCore/Module.cpp
@@ -16,10 +16,12 @@
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/LeakDetector.h"
#include "SymbolTableListTraitsImpl.h"
#include <algorithm>
#include <cstdarg>
+#include <cstdlib>
#include <iostream>
#include <map>
using namespace llvm;
@@ -61,7 +63,7 @@ template class SymbolTableListTraits<Function, Module, Module>;
//
Module::Module(const std::string &MID)
- : ModuleID(MID), Endian(AnyEndianness), PtrSize(AnyPointerSize) {
+ : ModuleID(MID), DataLayout("") {
FunctionList.setItemParent(this);
FunctionList.setParent(this);
GlobalList.setItemParent(this);
@@ -84,6 +86,63 @@ void Module::dump() const {
print(std::cerr);
}
+/// Target endian information...
+Module::Endianness Module::getEndianness() const {
+ std::string temp = DataLayout;
+
+ while (temp.length() > 0) {
+ std::string token = getToken(temp, "-");
+
+ if (token[0] == 'e') {
+ return LittleEndian;
+ } else if (token[0] == 'E') {
+ return BigEndian;
+ }
+ }
+
+ return AnyEndianness;
+}
+
+void Module::setEndianness(Endianness E) {
+ if (DataLayout.compare("") != 0 && E != AnyEndianness)
+ DataLayout.insert(0, "-");
+
+ if (E == LittleEndian)
+ DataLayout.insert(0, "e");
+ else if (E == BigEndian)
+ DataLayout.insert(0, "E");
+}
+
+/// Target Pointer Size information...
+Module::PointerSize Module::getPointerSize() const {
+ std::string temp = DataLayout;
+
+ while (temp.length() > 0) {
+ std::string token = getToken(temp, "-");
+ char signal = getToken(token, ":")[0];
+
+ if (signal == 'p') {
+ int size = atoi(getToken(token, ":").c_str());
+ if (size == 32)
+ return Pointer32;
+ else if (size == 64)
+ return Pointer64;
+ }
+ }
+
+ return AnyPointerSize;
+}
+
+void Module::setPointerSize(PointerSize PS) {
+ if (DataLayout.compare("") != 0 && PS != AnyPointerSize)
+ DataLayout.insert(0, "-");
+
+ if (PS == Pointer32)
+ DataLayout.insert(0, "p:32:32");
+ else if (PS == Pointer64)
+ DataLayout.insert(0, "p:64:64");
+}
+
//===----------------------------------------------------------------------===//
// Methods for easy access to the functions in the module.
//