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:
Rafael Espindola 2007-07-06 10:57:03 +00:00
parent aa6b7fd5ec
commit 1aa7efbd2c
10 changed files with 29 additions and 6 deletions

View File

@ -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
};

View File

@ -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
};
}

View File

@ -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); }

View File

@ -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; }

View File

@ -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)) {

View File

@ -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;
}

View File

@ -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>
]>;

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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!";
}
}
}