Skip to content

Commit 3c0e11a

Browse files
author
Dan Gohman
committed
For now, abort when an ISD::VAARG is encountered on x86-64, rather
than silently generate invalid code. llvm-gcc does not currently use VAArgInst; it lowers va_arg in the front-end. llvm-svn: 50930
1 parent da2587c commit 3c0e11a

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,14 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM)
327327

328328
// VASTART needs to be custom lowered to use the VarArgsFrameIndex
329329
setOperationAction(ISD::VASTART , MVT::Other, Custom);
330-
setOperationAction(ISD::VAARG , MVT::Other, Expand);
331330
setOperationAction(ISD::VAEND , MVT::Other, Expand);
332-
if (Subtarget->is64Bit())
331+
if (Subtarget->is64Bit()) {
332+
setOperationAction(ISD::VAARG , MVT::Other, Custom);
333333
setOperationAction(ISD::VACOPY , MVT::Other, Custom);
334-
else
334+
} else {
335+
setOperationAction(ISD::VAARG , MVT::Other, Expand);
335336
setOperationAction(ISD::VACOPY , MVT::Other, Expand);
337+
}
336338

337339
setOperationAction(ISD::STACKSAVE, MVT::Other, Expand);
338340
setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
@@ -4976,6 +4978,17 @@ SDOperand X86TargetLowering::LowerVASTART(SDOperand Op, SelectionDAG &DAG) {
49764978
return DAG.getNode(ISD::TokenFactor, MVT::Other, &MemOps[0], MemOps.size());
49774979
}
49784980

4981+
SDOperand X86TargetLowering::LowerVAARG(SDOperand Op, SelectionDAG &DAG) {
4982+
// X86-64 va_list is a struct { i32, i32, i8*, i8* }.
4983+
assert(Subtarget->is64Bit() && "This code only handles 64-bit va_arg!");
4984+
SDOperand Chain = Op.getOperand(0);
4985+
SDOperand SrcPtr = Op.getOperand(1);
4986+
SDOperand SrcSV = Op.getOperand(2);
4987+
4988+
assert(0 && "VAArgInst is not yet implemented for x86-64!");
4989+
abort();
4990+
}
4991+
49794992
SDOperand X86TargetLowering::LowerVACOPY(SDOperand Op, SelectionDAG &DAG) {
49804993
// X86-64 va_list is a struct { i32, i32, i8*, i8* }.
49814994
assert(Subtarget->is64Bit() && "This code only handles 64-bit va_copy!");
@@ -5598,6 +5611,7 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
55985611
case ISD::RET: return LowerRET(Op, DAG);
55995612
case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG);
56005613
case ISD::VASTART: return LowerVASTART(Op, DAG);
5614+
case ISD::VAARG: return LowerVAARG(Op, DAG);
56015615
case ISD::VACOPY: return LowerVACOPY(Op, DAG);
56025616
case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
56035617
case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG);

llvm/lib/Target/X86/X86ISelLowering.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ namespace llvm {
517517
SDOperand LowerDYNAMIC_STACKALLOC(SDOperand Op, SelectionDAG &DAG);
518518
SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG);
519519
SDOperand LowerVASTART(SDOperand Op, SelectionDAG &DAG);
520+
SDOperand LowerVAARG(SDOperand Op, SelectionDAG &DAG);
520521
SDOperand LowerVACOPY(SDOperand Op, SelectionDAG &DAG);
521522
SDOperand LowerINTRINSIC_WO_CHAIN(SDOperand Op, SelectionDAG &DAG);
522523
SDOperand LowerRETURNADDR(SDOperand Op, SelectionDAG &DAG);

0 commit comments

Comments
 (0)