mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
Backing out patch. Will refactor to remove the AsmParser dependency on Target.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142323 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6248a546f2
commit
d8ffe5bb16
@ -44,7 +44,7 @@ enum AlignTypeEnum {
|
|||||||
AGGREGATE_ALIGN = 'a', ///< Aggregate alignment
|
AGGREGATE_ALIGN = 'a', ///< Aggregate alignment
|
||||||
STACK_ALIGN = 's' ///< Stack objects alignment
|
STACK_ALIGN = 's' ///< Stack objects alignment
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Target alignment element.
|
/// Target alignment element.
|
||||||
///
|
///
|
||||||
/// Stores the alignment data associated with a given alignment type (pointer,
|
/// Stores the alignment data associated with a given alignment type (pointer,
|
||||||
@ -80,7 +80,7 @@ private:
|
|||||||
unsigned StackNaturalAlign; ///< Stack natural alignment
|
unsigned StackNaturalAlign; ///< Stack natural alignment
|
||||||
|
|
||||||
SmallVector<unsigned char, 8> LegalIntWidths; ///< Legal Integers.
|
SmallVector<unsigned char, 8> LegalIntWidths; ///< Legal Integers.
|
||||||
|
|
||||||
/// Alignments- Where the primitive type alignment data is stored.
|
/// Alignments- Where the primitive type alignment data is stored.
|
||||||
///
|
///
|
||||||
/// @sa init().
|
/// @sa init().
|
||||||
@ -88,7 +88,7 @@ private:
|
|||||||
/// pointers vs. 64-bit pointers by extending TargetAlignment, but for now,
|
/// pointers vs. 64-bit pointers by extending TargetAlignment, but for now,
|
||||||
/// we don't.
|
/// we don't.
|
||||||
SmallVector<TargetAlignElem, 16> Alignments;
|
SmallVector<TargetAlignElem, 16> Alignments;
|
||||||
|
|
||||||
/// InvalidAlignmentElem - This member is a signal that a requested alignment
|
/// InvalidAlignmentElem - This member is a signal that a requested alignment
|
||||||
/// type and bit width were not found in the SmallVector.
|
/// type and bit width were not found in the SmallVector.
|
||||||
static const TargetAlignElem InvalidAlignmentElem;
|
static const TargetAlignElem InvalidAlignmentElem;
|
||||||
@ -112,30 +112,19 @@ private:
|
|||||||
return &align != &InvalidAlignmentElem;
|
return &align != &InvalidAlignmentElem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initialise a TargetData object with default values, ensure that the
|
|
||||||
/// target data pass is registered.
|
|
||||||
void init();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Default ctor.
|
/// Default ctor.
|
||||||
///
|
///
|
||||||
/// @note This has to exist, because this is a pass, but it should never be
|
/// @note This has to exist, because this is a pass, but it should never be
|
||||||
/// used.
|
/// used.
|
||||||
TargetData();
|
TargetData();
|
||||||
|
|
||||||
/// Constructs a TargetData from a specification string. See init().
|
/// Constructs a TargetData from a specification string. See init().
|
||||||
explicit TargetData(StringRef TargetDescription)
|
explicit TargetData(StringRef TargetDescription)
|
||||||
: ImmutablePass(ID) {
|
: ImmutablePass(ID) {
|
||||||
std::string errMsg = parseSpecifier(TargetDescription, this);
|
init(TargetDescription);
|
||||||
assert(errMsg == "" && "Invalid target data layout string.");
|
|
||||||
(void)errMsg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a target data specification string. Returns an error message
|
|
||||||
/// if the string is malformed, or the empty string on success. Optionally
|
|
||||||
/// initialises a TargetData object if passed a non-null pointer.
|
|
||||||
static std::string parseSpecifier(StringRef TargetDescription, TargetData* td = 0);
|
|
||||||
|
|
||||||
/// Initialize target data from properties stored in the module.
|
/// Initialize target data from properties stored in the module.
|
||||||
explicit TargetData(const Module *M);
|
explicit TargetData(const Module *M);
|
||||||
|
|
||||||
@ -152,6 +141,9 @@ public:
|
|||||||
|
|
||||||
~TargetData(); // Not virtual, do not subclass this class
|
~TargetData(); // Not virtual, do not subclass this class
|
||||||
|
|
||||||
|
//! Parse a target data layout string and initialize TargetData alignments.
|
||||||
|
void init(StringRef TargetDescription);
|
||||||
|
|
||||||
/// Target endianness...
|
/// Target endianness...
|
||||||
bool isLittleEndian() const { return LittleEndian; }
|
bool isLittleEndian() const { return LittleEndian; }
|
||||||
bool isBigEndian() const { return !LittleEndian; }
|
bool isBigEndian() const { return !LittleEndian; }
|
||||||
@ -160,7 +152,7 @@ public:
|
|||||||
/// TargetData. This representation is in the same format accepted by the
|
/// TargetData. This representation is in the same format accepted by the
|
||||||
/// string constructor above.
|
/// string constructor above.
|
||||||
std::string getStringRepresentation() const;
|
std::string getStringRepresentation() const;
|
||||||
|
|
||||||
/// isLegalInteger - This function returns true if the specified type is
|
/// isLegalInteger - This function returns true if the specified type is
|
||||||
/// known to be a native integer type supported by the CPU. For example,
|
/// known to be a native integer type supported by the CPU. For example,
|
||||||
/// i64 is not native on most 32-bit CPUs and i37 is not native on any known
|
/// i64 is not native on most 32-bit CPUs and i37 is not native on any known
|
||||||
@ -174,7 +166,7 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isIllegalInteger(unsigned Width) const {
|
bool isIllegalInteger(unsigned Width) const {
|
||||||
return !isLegalInteger(Width);
|
return !isLegalInteger(Width);
|
||||||
}
|
}
|
||||||
@ -259,11 +251,11 @@ public:
|
|||||||
/// getABITypeAlignment - Return the minimum ABI-required alignment for the
|
/// getABITypeAlignment - Return the minimum ABI-required alignment for the
|
||||||
/// specified type.
|
/// specified type.
|
||||||
unsigned getABITypeAlignment(Type *Ty) const;
|
unsigned getABITypeAlignment(Type *Ty) const;
|
||||||
|
|
||||||
/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
|
/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
|
||||||
/// an integer type of the specified bitwidth.
|
/// an integer type of the specified bitwidth.
|
||||||
unsigned getABIIntegerTypeAlignment(unsigned BitWidth) const;
|
unsigned getABIIntegerTypeAlignment(unsigned BitWidth) const;
|
||||||
|
|
||||||
|
|
||||||
/// getCallFrameTypeAlignment - Return the minimum ABI-required alignment
|
/// getCallFrameTypeAlignment - Return the minimum ABI-required alignment
|
||||||
/// for the specified type when it is part of a call frame.
|
/// for the specified type when it is part of a call frame.
|
||||||
@ -313,7 +305,7 @@ public:
|
|||||||
assert((Alignment & (Alignment-1)) == 0 && "Alignment must be power of 2!");
|
assert((Alignment & (Alignment-1)) == 0 && "Alignment must be power of 2!");
|
||||||
return (Val + (Alignment-1)) & ~UIntTy(Alignment-1);
|
return (Val + (Alignment-1)) & ~UIntTy(Alignment-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char ID; // Pass identification, replacement for typeid
|
static char ID; // Pass identification, replacement for typeid
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -8,5 +8,4 @@ add_llvm_library(LLVMAsmParser
|
|||||||
add_llvm_library_dependencies(LLVMAsmParser
|
add_llvm_library_dependencies(LLVMAsmParser
|
||||||
LLVMCore
|
LLVMCore
|
||||||
LLVMSupport
|
LLVMSupport
|
||||||
LLVMTarget
|
|
||||||
)
|
)
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include "llvm/ADT/SmallPtrSet.h"
|
#include "llvm/ADT/SmallPtrSet.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
static std::string getTypeString(Type *T) {
|
static std::string getTypeString(Type *T) {
|
||||||
@ -261,14 +260,9 @@ bool LLParser::ParseTargetDefinition() {
|
|||||||
return false;
|
return false;
|
||||||
case lltok::kw_datalayout:
|
case lltok::kw_datalayout:
|
||||||
Lex.Lex();
|
Lex.Lex();
|
||||||
LocTy SpecifierLoc = Lex.getLoc();
|
|
||||||
if (ParseToken(lltok::equal, "expected '=' after target datalayout") ||
|
if (ParseToken(lltok::equal, "expected '=' after target datalayout") ||
|
||||||
ParseStringConstant(Str))
|
ParseStringConstant(Str))
|
||||||
return true;
|
return true;
|
||||||
std::string errMsg = TargetData::parseSpecifier(Str);
|
|
||||||
if (errMsg != "") {
|
|
||||||
return Error(SpecifierLoc, errMsg);
|
|
||||||
}
|
|
||||||
M->setDataLayout(Str);
|
M->setDataLayout(Str);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -125,15 +125,15 @@ const TargetAlignElem TargetData::InvalidAlignmentElem =
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
/// getInt - Get an integer ignoring errors.
|
/// getInt - Get an integer ignoring errors.
|
||||||
static int getInt(StringRef R) {
|
static unsigned getInt(StringRef R) {
|
||||||
int Result = 0;
|
unsigned Result = 0;
|
||||||
R.getAsInteger(10, Result);
|
R.getAsInteger(10, Result);
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetData::init() {
|
void TargetData::init(StringRef Desc) {
|
||||||
initializeTargetDataPass(*PassRegistry::getPassRegistry());
|
initializeTargetDataPass(*PassRegistry::getPassRegistry());
|
||||||
|
|
||||||
LayoutMap = 0;
|
LayoutMap = 0;
|
||||||
LittleEndian = false;
|
LittleEndian = false;
|
||||||
PointerMemSize = 8;
|
PointerMemSize = 8;
|
||||||
@ -152,12 +152,6 @@ void TargetData::init() {
|
|||||||
setAlignment(VECTOR_ALIGN, 8, 8, 64); // v2i32, v1i64, ...
|
setAlignment(VECTOR_ALIGN, 8, 8, 64); // v2i32, v1i64, ...
|
||||||
setAlignment(VECTOR_ALIGN, 16, 16, 128); // v16i8, v8i16, v4i32, ...
|
setAlignment(VECTOR_ALIGN, 16, 16, 128); // v16i8, v8i16, v4i32, ...
|
||||||
setAlignment(AGGREGATE_ALIGN, 0, 8, 0); // struct
|
setAlignment(AGGREGATE_ALIGN, 0, 8, 0); // struct
|
||||||
}
|
|
||||||
|
|
||||||
std::string TargetData::parseSpecifier(StringRef Desc, TargetData *td) {
|
|
||||||
|
|
||||||
if (td)
|
|
||||||
td->init();
|
|
||||||
|
|
||||||
while (!Desc.empty()) {
|
while (!Desc.empty()) {
|
||||||
std::pair<StringRef, StringRef> Split = Desc.split('-');
|
std::pair<StringRef, StringRef> Split = Desc.split('-');
|
||||||
@ -175,54 +169,28 @@ std::string TargetData::parseSpecifier(StringRef Desc, TargetData *td) {
|
|||||||
|
|
||||||
switch (Specifier[0]) {
|
switch (Specifier[0]) {
|
||||||
case 'E':
|
case 'E':
|
||||||
if (td)
|
LittleEndian = false;
|
||||||
td->LittleEndian = false;
|
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
if (td)
|
LittleEndian = true;
|
||||||
td->LittleEndian = true;
|
|
||||||
break;
|
break;
|
||||||
case 'p': {
|
case 'p':
|
||||||
// Pointer size.
|
|
||||||
Split = Token.split(':');
|
Split = Token.split(':');
|
||||||
int PointerMemSizeBits = getInt(Split.first);
|
PointerMemSize = getInt(Split.first) / 8;
|
||||||
if (PointerMemSizeBits < 0 || PointerMemSizeBits % 8 != 0)
|
|
||||||
return "invalid pointer size, must be a positive 8-bit multiple";
|
|
||||||
if (td)
|
|
||||||
td->PointerMemSize = PointerMemSizeBits / 8;
|
|
||||||
|
|
||||||
// Pointer ABI alignment.
|
|
||||||
Split = Split.second.split(':');
|
Split = Split.second.split(':');
|
||||||
int PointerABIAlignBits = getInt(Split.first);
|
PointerABIAlign = getInt(Split.first) / 8;
|
||||||
if (PointerABIAlignBits < 0 || PointerABIAlignBits % 8 != 0) {
|
|
||||||
return "invalid pointer ABI alignment, "
|
|
||||||
"must be a positive 8-bit multiple";
|
|
||||||
}
|
|
||||||
if (td)
|
|
||||||
td->PointerABIAlign = PointerABIAlignBits / 8;
|
|
||||||
|
|
||||||
// Pointer preferred alignment.
|
|
||||||
Split = Split.second.split(':');
|
Split = Split.second.split(':');
|
||||||
int PointerPrefAlignBits = getInt(Split.first);
|
PointerPrefAlign = getInt(Split.first) / 8;
|
||||||
if (PointerPrefAlignBits < 0 || PointerPrefAlignBits % 8 != 0) {
|
if (PointerPrefAlign == 0)
|
||||||
return "invalid pointer preferred alignment, "
|
PointerPrefAlign = PointerABIAlign;
|
||||||
"must be a positive 8-bit multiple";
|
|
||||||
}
|
|
||||||
if (td) {
|
|
||||||
td->PointerPrefAlign = PointerPrefAlignBits / 8;
|
|
||||||
if (td->PointerPrefAlign == 0)
|
|
||||||
td->PointerPrefAlign = td->PointerABIAlign;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case 'i':
|
case 'i':
|
||||||
case 'v':
|
case 'v':
|
||||||
case 'f':
|
case 'f':
|
||||||
case 'a':
|
case 'a':
|
||||||
case 's': {
|
case 's': {
|
||||||
AlignTypeEnum AlignType;
|
AlignTypeEnum AlignType;
|
||||||
char field = Specifier[0];
|
switch (Specifier[0]) {
|
||||||
switch (field) {
|
|
||||||
default:
|
default:
|
||||||
case 'i': AlignType = INTEGER_ALIGN; break;
|
case 'i': AlignType = INTEGER_ALIGN; break;
|
||||||
case 'v': AlignType = VECTOR_ALIGN; break;
|
case 'v': AlignType = VECTOR_ALIGN; break;
|
||||||
@ -230,66 +198,37 @@ std::string TargetData::parseSpecifier(StringRef Desc, TargetData *td) {
|
|||||||
case 'a': AlignType = AGGREGATE_ALIGN; break;
|
case 'a': AlignType = AGGREGATE_ALIGN; break;
|
||||||
case 's': AlignType = STACK_ALIGN; break;
|
case 's': AlignType = STACK_ALIGN; break;
|
||||||
}
|
}
|
||||||
int Size = getInt(Specifier.substr(1));
|
unsigned Size = getInt(Specifier.substr(1));
|
||||||
if (Size < 0) {
|
|
||||||
return std::string("invalid ") + field + "-size field, "
|
|
||||||
"must be positive";
|
|
||||||
}
|
|
||||||
|
|
||||||
Split = Token.split(':');
|
Split = Token.split(':');
|
||||||
int ABIAlignBits = getInt(Split.first);
|
unsigned ABIAlign = getInt(Split.first) / 8;
|
||||||
if (ABIAlignBits < 0 || ABIAlignBits % 8 != 0) {
|
|
||||||
return std::string("invalid ") + field +"-abi-alignment field, "
|
|
||||||
"must be a positive 8-bit multiple";
|
|
||||||
}
|
|
||||||
unsigned ABIAlign = ABIAlignBits / 8;
|
|
||||||
|
|
||||||
Split = Split.second.split(':');
|
Split = Split.second.split(':');
|
||||||
|
unsigned PrefAlign = getInt(Split.first) / 8;
|
||||||
int PrefAlignBits = getInt(Split.first);
|
|
||||||
if (PrefAlignBits < 0 || PrefAlignBits % 8 != 0) {
|
|
||||||
return std::string("invalid ") + field +"-preferred-alignment field, "
|
|
||||||
"must be a positive 8-bit multiple";
|
|
||||||
}
|
|
||||||
unsigned PrefAlign = PrefAlignBits / 8;
|
|
||||||
if (PrefAlign == 0)
|
if (PrefAlign == 0)
|
||||||
PrefAlign = ABIAlign;
|
PrefAlign = ABIAlign;
|
||||||
|
setAlignment(AlignType, ABIAlign, PrefAlign, Size);
|
||||||
if (td)
|
|
||||||
td->setAlignment(AlignType, ABIAlign, PrefAlign, Size);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'n': // Native integer types.
|
case 'n': // Native integer types.
|
||||||
Specifier = Specifier.substr(1);
|
Specifier = Specifier.substr(1);
|
||||||
do {
|
do {
|
||||||
int Width = getInt(Specifier);
|
if (unsigned Width = getInt(Specifier))
|
||||||
if (Width <= 0) {
|
LegalIntWidths.push_back(Width);
|
||||||
return std::string("invalid native integer size \'") + Specifier.str() +
|
|
||||||
"\', must be a positive integer.";
|
|
||||||
}
|
|
||||||
if (td && Width != 0)
|
|
||||||
td->LegalIntWidths.push_back(Width);
|
|
||||||
Split = Token.split(':');
|
Split = Token.split(':');
|
||||||
Specifier = Split.first;
|
Specifier = Split.first;
|
||||||
Token = Split.second;
|
Token = Split.second;
|
||||||
} while (!Specifier.empty() || !Token.empty());
|
} while (!Specifier.empty() || !Token.empty());
|
||||||
break;
|
break;
|
||||||
case 'S': { // Stack natural alignment.
|
case 'S': // Stack natural alignment.
|
||||||
int StackNaturalAlignBits = getInt(Specifier.substr(1));
|
StackNaturalAlign = getInt(Specifier.substr(1));
|
||||||
if (StackNaturalAlignBits < 0 || StackNaturalAlignBits % 8 != 0) {
|
StackNaturalAlign /= 8;
|
||||||
return "invalid natural stack alignment (S-field), "
|
// FIXME: Should we really be truncating these alingments and
|
||||||
"must be a positive 8-bit multiple";
|
// sizes silently?
|
||||||
}
|
|
||||||
if (td)
|
|
||||||
td->StackNaturalAlign = StackNaturalAlignBits / 8;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Default ctor.
|
/// Default ctor.
|
||||||
@ -303,9 +242,7 @@ TargetData::TargetData() : ImmutablePass(ID) {
|
|||||||
|
|
||||||
TargetData::TargetData(const Module *M)
|
TargetData::TargetData(const Module *M)
|
||||||
: ImmutablePass(ID) {
|
: ImmutablePass(ID) {
|
||||||
std::string errMsg = parseSpecifier(M->getDataLayout(), this);
|
init(M->getDataLayout());
|
||||||
assert(errMsg == "" && "Module M has malformed target data layout string.");
|
|
||||||
(void)errMsg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user