mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
[ms-inline asm] Add the inline assembly dialect, AsmDialect, to the InlineAsm
class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163175 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4e2132e7ae
commit
03fe8f6ab6
@ -43,10 +43,12 @@ class InlineAsm : public Value {
|
||||
std::string AsmString, Constraints;
|
||||
bool HasSideEffects;
|
||||
bool IsAlignStack;
|
||||
|
||||
/// AsmDialect - 0 is AT&T (default) and 1 is the Intel dialect.
|
||||
unsigned AsmDialect;
|
||||
|
||||
InlineAsm(PointerType *Ty, const std::string &AsmString,
|
||||
const std::string &Constraints, bool hasSideEffects,
|
||||
bool isAlignStack);
|
||||
bool isAlignStack, unsigned asmDialect);
|
||||
virtual ~InlineAsm();
|
||||
|
||||
/// When the ConstantUniqueMap merges two types and makes two InlineAsms
|
||||
@ -58,11 +60,12 @@ public:
|
||||
///
|
||||
static InlineAsm *get(FunctionType *Ty, StringRef AsmString,
|
||||
StringRef Constraints, bool hasSideEffects,
|
||||
bool isAlignStack = false);
|
||||
bool isAlignStack = false, unsigned asmDialect = 0);
|
||||
|
||||
bool hasSideEffects() const { return HasSideEffects; }
|
||||
bool isAlignStack() const { return IsAlignStack; }
|
||||
|
||||
unsigned getDialect() const { return AsmDialect; }
|
||||
|
||||
/// getType - InlineAsm's are always pointers.
|
||||
///
|
||||
PointerType *getType() const {
|
||||
|
@ -352,18 +352,21 @@ struct ExprMapKeyType {
|
||||
struct InlineAsmKeyType {
|
||||
InlineAsmKeyType(StringRef AsmString,
|
||||
StringRef Constraints, bool hasSideEffects,
|
||||
bool isAlignStack)
|
||||
bool isAlignStack, unsigned asmDialect)
|
||||
: asm_string(AsmString), constraints(Constraints),
|
||||
has_side_effects(hasSideEffects), is_align_stack(isAlignStack) {}
|
||||
has_side_effects(hasSideEffects), is_align_stack(isAlignStack),
|
||||
asm_dialect(asmDialect) {}
|
||||
std::string asm_string;
|
||||
std::string constraints;
|
||||
bool has_side_effects;
|
||||
bool is_align_stack;
|
||||
unsigned asm_dialect;
|
||||
bool operator==(const InlineAsmKeyType& that) const {
|
||||
return this->asm_string == that.asm_string &&
|
||||
this->constraints == that.constraints &&
|
||||
this->has_side_effects == that.has_side_effects &&
|
||||
this->is_align_stack == that.is_align_stack;
|
||||
this->is_align_stack == that.is_align_stack &&
|
||||
this->asm_dialect == that.asm_dialect;
|
||||
}
|
||||
bool operator<(const InlineAsmKeyType& that) const {
|
||||
if (this->asm_string != that.asm_string)
|
||||
@ -374,6 +377,8 @@ struct InlineAsmKeyType {
|
||||
return this->has_side_effects < that.has_side_effects;
|
||||
if (this->is_align_stack != that.is_align_stack)
|
||||
return this->is_align_stack < that.is_align_stack;
|
||||
if (this->asm_dialect != that.asm_dialect)
|
||||
return this->asm_dialect < that.asm_dialect;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -490,7 +495,8 @@ template<>
|
||||
struct ConstantCreator<InlineAsm, PointerType, InlineAsmKeyType> {
|
||||
static InlineAsm *create(PointerType *Ty, const InlineAsmKeyType &Key) {
|
||||
return new InlineAsm(Ty, Key.asm_string, Key.constraints,
|
||||
Key.has_side_effects, Key.is_align_stack);
|
||||
Key.has_side_effects, Key.is_align_stack,
|
||||
Key.asm_dialect);
|
||||
}
|
||||
};
|
||||
|
||||
@ -499,7 +505,8 @@ struct ConstantKeyData<InlineAsm> {
|
||||
typedef InlineAsmKeyType ValType;
|
||||
static ValType getValType(InlineAsm *Asm) {
|
||||
return InlineAsmKeyType(Asm->getAsmString(), Asm->getConstraintString(),
|
||||
Asm->hasSideEffects(), Asm->isAlignStack());
|
||||
Asm->hasSideEffects(), Asm->isAlignStack(),
|
||||
Asm->getDialect());
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1055,9 +1055,11 @@ LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
|
||||
LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
|
||||
const char *Constraints,
|
||||
LLVMBool HasSideEffects,
|
||||
LLVMBool IsAlignStack) {
|
||||
LLVMBool IsAlignStack,
|
||||
unsigned AsmDialect) {
|
||||
return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
|
||||
Constraints, HasSideEffects, IsAlignStack));
|
||||
Constraints, HasSideEffects, IsAlignStack,
|
||||
AsmDialect));
|
||||
}
|
||||
|
||||
LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) {
|
||||
|
@ -27,19 +27,20 @@ InlineAsm::~InlineAsm() {
|
||||
|
||||
InlineAsm *InlineAsm::get(FunctionType *Ty, StringRef AsmString,
|
||||
StringRef Constraints, bool hasSideEffects,
|
||||
bool isAlignStack) {
|
||||
InlineAsmKeyType Key(AsmString, Constraints, hasSideEffects, isAlignStack);
|
||||
bool isAlignStack, unsigned asmDialect) {
|
||||
InlineAsmKeyType Key(AsmString, Constraints, hasSideEffects, isAlignStack,
|
||||
asmDialect);
|
||||
LLVMContextImpl *pImpl = Ty->getContext().pImpl;
|
||||
return pImpl->InlineAsms.getOrCreate(PointerType::getUnqual(Ty), Key);
|
||||
}
|
||||
|
||||
InlineAsm::InlineAsm(PointerType *Ty, const std::string &asmString,
|
||||
const std::string &constraints, bool hasSideEffects,
|
||||
bool isAlignStack)
|
||||
bool isAlignStack, unsigned asmDialect)
|
||||
: Value(Ty, Value::InlineAsmVal),
|
||||
AsmString(asmString),
|
||||
Constraints(constraints), HasSideEffects(hasSideEffects),
|
||||
IsAlignStack(isAlignStack) {
|
||||
AsmString(asmString), Constraints(constraints),
|
||||
HasSideEffects(hasSideEffects), IsAlignStack(isAlignStack),
|
||||
AsmDialect(asmDialect) {
|
||||
|
||||
// Do various checks on the constraint string and type.
|
||||
assert(Verify(getFunctionType(), constraints) &&
|
||||
|
Loading…
Reference in New Issue
Block a user