mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Add a new constructor to TargetData that builds a TargetData from its
string representation. This is part of PR 761. llvm-svn: 28234
This commit is contained in:
parent
a500852895
commit
30ffff31f2
@ -53,6 +53,13 @@ public:
|
||||
unsigned char IntAl = 4, unsigned char ShortAl = 2,
|
||||
unsigned char ByteAl = 1, unsigned char BoolAl = 1);
|
||||
|
||||
/// Constructs a TargetData from a string of the following format:
|
||||
/// "E-p:64:64-d:64:64-f:32:32-l:64:64-i:32:32-s:16:16-b:8:8-B:8:8"
|
||||
/// The above string is considered the default, and any values not specified
|
||||
/// in the string will be assumed to be as above.
|
||||
TargetData(const std::string &TargetName,
|
||||
const std::string &TargetDescription);
|
||||
|
||||
// Copy constructor
|
||||
TargetData (const TargetData &TD) :
|
||||
ImmutablePass(),
|
||||
|
@ -22,7 +22,9 @@
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include <algorithm>
|
||||
#include <cstdlib>
|
||||
using namespace llvm;
|
||||
|
||||
// Handle the Pass registration stuff necessary to use TargetData's.
|
||||
@ -118,6 +120,69 @@ TargetData::TargetData(const std::string &TargetName,
|
||||
BoolAlignment = BoolAl;
|
||||
}
|
||||
|
||||
TargetData::TargetData(const std::string &TargetName,
|
||||
const std::string &TargetDescription) {
|
||||
std::string temp = TargetDescription;
|
||||
|
||||
LittleEndian = false;
|
||||
PointerSize = 8;
|
||||
PointerAlignment = 8;
|
||||
DoubleAlignment = 8;
|
||||
FloatAlignment = 4;
|
||||
LongAlignment = 8;
|
||||
IntAlignment = 4;
|
||||
ShortAlignment = 2;
|
||||
ByteAlignment = 1;
|
||||
BoolAlignment = 1;
|
||||
|
||||
while (temp.length() > 0) {
|
||||
std::string token = getToken(temp, "-");
|
||||
|
||||
switch(token[0]) {
|
||||
case 'E':
|
||||
LittleEndian = false;
|
||||
break;
|
||||
case 'e':
|
||||
LittleEndian = true;
|
||||
break;
|
||||
case 'p':
|
||||
PointerSize = atoi(getToken(token,":").c_str()) / 8;
|
||||
PointerAlignment = atoi(getToken(token,":").c_str()) / 8;
|
||||
break;
|
||||
case 'd':
|
||||
token = getToken(token,":"); //Ignore the size
|
||||
DoubleAlignment = atoi(getToken(token,":").c_str()) / 8;
|
||||
break;
|
||||
case 'f':
|
||||
token = getToken(token, ":"); //Ignore the size
|
||||
FloatAlignment = atoi(getToken(token, ":").c_str()) / 8;
|
||||
break;
|
||||
case 'l':
|
||||
token = getToken(token, ":"); //Ignore the size
|
||||
LongAlignment = atoi(getToken(token, ":").c_str()) / 8;
|
||||
break;
|
||||
case 'i':
|
||||
token = getToken(token, ":"); //Ignore the size
|
||||
IntAlignment = atoi(getToken(token, ":").c_str()) / 8;
|
||||
break;
|
||||
case 's':
|
||||
token = getToken(token, ":"); //Ignore the size
|
||||
ShortAlignment = atoi(getToken(token, ":").c_str()) / 8;
|
||||
break;
|
||||
case 'b':
|
||||
token = getToken(token, ":"); //Ignore the size
|
||||
ByteAlignment = atoi(getToken(token, ":").c_str()) / 8;
|
||||
break;
|
||||
case 'B':
|
||||
token = getToken(token, ":"); //Ignore the size
|
||||
BoolAlignment = atoi(getToken(token, ":").c_str()) / 8;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TargetData::TargetData(const std::string &ToolName, const Module *M) {
|
||||
LittleEndian = M->getEndianness() != Module::BigEndian;
|
||||
PointerSize = M->getPointerSize() != Module::Pointer64 ? 4 : 8;
|
||||
|
Loading…
Reference in New Issue
Block a user