mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Add the byval attribute
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37940 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
aa6b7fd5ec
commit
1aa7efbd2c
@ -63,6 +63,8 @@ namespace ISD {
|
||||
InRegOffs = 2,
|
||||
StructReturn = 1<<3, ///< Hidden struct-return pointer
|
||||
StructReturnOffs = 3,
|
||||
ByVal = 1<<4, ///< Struct passed by value
|
||||
ByValOffs = 4,
|
||||
OrigAlignment = 0x1F<<27,
|
||||
OrigAlignmentOffs = 27
|
||||
};
|
||||
|
@ -36,7 +36,8 @@ enum Attributes {
|
||||
InReg = 1 << 3, ///< force argument to be passed in register
|
||||
StructRet = 1 << 4, ///< hidden pointer to structure to return
|
||||
NoUnwind = 1 << 5, ///< Function doesn't unwind stack
|
||||
NoAlias = 1 << 6 ///< Considered to not alias after call.
|
||||
NoAlias = 1 << 6, ///< Considered to not alias after call.
|
||||
ByVal = 1 << 7 ///< Pass structure by value
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -230,6 +230,7 @@ sret { return SRET; }
|
||||
nounwind { return NOUNWIND; }
|
||||
noreturn { return NORETURN; }
|
||||
noalias { return NOALIAS; }
|
||||
byval { return BYVAL; }
|
||||
|
||||
void { RET_TY(Type::VoidTy, VOID); }
|
||||
float { RET_TY(Type::FloatTy, FLOAT); }
|
||||
|
@ -1101,7 +1101,7 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
|
||||
%token <OtherOpVal> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
|
||||
|
||||
// Function Attributes
|
||||
%token NORETURN INREG SRET NOUNWIND NOALIAS
|
||||
%token NORETURN INREG SRET NOUNWIND NOALIAS BYVAL
|
||||
|
||||
// Visibility Styles
|
||||
%token DEFAULT HIDDEN PROTECTED
|
||||
@ -1229,6 +1229,7 @@ ParamAttr : ZEXT { $$ = ParamAttr::ZExt; }
|
||||
| INREG { $$ = ParamAttr::InReg; }
|
||||
| SRET { $$ = ParamAttr::StructRet; }
|
||||
| NOALIAS { $$ = ParamAttr::NoAlias; }
|
||||
| BYVAL { $$ = ParamAttr::ByVal; }
|
||||
;
|
||||
|
||||
OptParamAttrs : /* empty */ { $$ = ParamAttr::None; }
|
||||
|
@ -3789,6 +3789,8 @@ TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) {
|
||||
Flags |= ISD::ParamFlags::InReg;
|
||||
if (Attrs && Attrs->paramHasAttr(j, ParamAttr::StructRet))
|
||||
Flags |= ISD::ParamFlags::StructReturn;
|
||||
if (Attrs && Attrs->paramHasAttr(j, ParamAttr::ByVal))
|
||||
Flags |= ISD::ParamFlags::ByVal;
|
||||
Flags |= (OriginalAlignment << ISD::ParamFlags::OrigAlignmentOffs);
|
||||
|
||||
switch (getTypeAction(VT)) {
|
||||
|
@ -32,6 +32,11 @@ class CCIf<string predicate, CCAction A> : CCPredicateAction<A> {
|
||||
string Predicate = predicate;
|
||||
}
|
||||
|
||||
/// CCIfStruct - If the current argument is a struct, apply
|
||||
/// Action A.
|
||||
class CCIfStruct<CCAction A> : CCIf<"ArgFlags & ISD::ParamFlags::ByVal", A> {
|
||||
}
|
||||
|
||||
/// CCIfCC - Match of the current calling convention is 'CC'.
|
||||
class CCIfCC<string CC, CCAction A>
|
||||
: CCIf<!strconcat("State.getCallingConv() == ", CC), A> {}
|
||||
@ -57,6 +62,12 @@ class CCAssignToStack<int size, int align> : CCAction {
|
||||
int Align = align;
|
||||
}
|
||||
|
||||
/// CCStructAssign - This action always matches: it will use the C ABI and
|
||||
/// the register availability to decided whether to assign to a set of
|
||||
/// registers or to a stack slot.
|
||||
class CCStructAssign<list<Register> regList> : CCAction {
|
||||
list<Register> RegList = regList;
|
||||
}
|
||||
|
||||
/// CCPromoteToType - If applied, this promotes the specified current value to
|
||||
/// the specified type.
|
||||
@ -75,4 +86,3 @@ class CCDelegateTo<CallingConv cc> : CCAction {
|
||||
class CallingConv<list<CCAction> actions> {
|
||||
list<CCAction> Actions = actions;
|
||||
}
|
||||
|
||||
|
@ -94,6 +94,8 @@ def CC_X86_64_C : CallingConv<[
|
||||
// Promote i8/i16 arguments to i32.
|
||||
CCIfType<[i8, i16], CCPromoteToType<i32>>,
|
||||
|
||||
CCIfStruct<CCStructAssign<[RDI, RSI, RDX, RCX, R8, R9 ]>>,
|
||||
|
||||
// The first 6 integer arguments are passed in integer registers.
|
||||
CCIfType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, R8D, R9D]>>,
|
||||
CCIfType<[i64], CCAssignToReg<[RDI, RSI, RDX, RCX, R8 , R9 ]>>,
|
||||
@ -168,5 +170,3 @@ def CC_X86_32_FastCall : CallingConv<[
|
||||
// Otherwise, same as everything else.
|
||||
CCDelegateTo<CC_X86_32_Common>
|
||||
]>;
|
||||
|
||||
|
||||
|
@ -103,6 +103,8 @@ ParamAttrsList::getParamAttrsText(uint16_t Attrs) {
|
||||
Result += "noalias ";
|
||||
if (Attrs & ParamAttr::StructRet)
|
||||
Result += "sret ";
|
||||
if (Attrs & ParamAttr::ByVal)
|
||||
Result += "byval ";
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
@ -370,6 +370,9 @@ void Verifier::visitFunction(Function &F) {
|
||||
if (Attrs->paramHasAttr(Idx, ParamAttr::NoAlias))
|
||||
Assert1(isa<PointerType>(FT->getParamType(Idx-1)),
|
||||
"Attribute NoAlias should only apply to Pointer type!", &F);
|
||||
if (Attrs->paramHasAttr(Idx, ParamAttr::ByVal))
|
||||
Assert1(isa<PointerType>(FT->getParamType(Idx-1)),
|
||||
"Attribute ByVal should only apply to Pointer type!", &F);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -129,10 +129,11 @@ void CallingConvEmitter::EmitAction(Record *Action,
|
||||
<< IndentStr << IndentStr << "LocInfo = CCValAssign::ZExt;\n"
|
||||
<< IndentStr << "else\n"
|
||||
<< IndentStr << IndentStr << "LocInfo = CCValAssign::AExt;\n";
|
||||
} else if (Action->isSubClassOf("CCStructAssign")) {
|
||||
O << "assert(0 && \"Not Implemented\");\n";
|
||||
} else {
|
||||
Action->dump();
|
||||
throw "Unknown CCAction!";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user