SectionFlags::Code);
O << "\n";
SwitchToSection (fCodeSection);
+
+ // Emit the frame address of the function at the beginning of code.
O << CurrentFnName << ":\n";
O << " retlw low(" << CurrentFnName << ".frame)\n";
O << " retlw high(" << CurrentFnName << ".frame)\n";
O << '\n';
}
CurBank = "";
+
+ // For emitting line directives, we need to keep track of the current
+ // source line. When it changes then only emit the line directive.
+ unsigned CurLine = 0;
for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end();
II != E; ++II) {
+ // Emit the line directive if source line changed.
+ const DebugLoc DL = II->getDebugLoc();
+ if (!DL.isUnknown()) {
+ unsigned line = MF.getDebugLocTuple(DL).Line;
+ if (line != CurLine) {
+ O << "\t.line " << line << "\n";
+ CurLine = line;
+ }
+ }
// Print the assembly for the instruction.
- printMachineInstruction(II);
+ printMachineInstruction(II);
}
}
return false; // we didn't modify anything.
//setOperationAction(ISD::TRUNCATE, MVT::i16, Custom);
setTruncStoreAction(MVT::i16, MVT::i8, Custom);
- setOperationAction(ISD::DBG_STOPPOINT, MVT::Other, Custom);
-
// Now deduce the information based on the above mentioned
// actions
computeRegisterProperties();
case PIC16ISD::SELECT_ICC: return "PIC16ISD::SELECT_ICC";
case PIC16ISD::BRCOND: return "PIC16ISD::BRCOND";
case PIC16ISD::Dummy: return "PIC16ISD::Dummy";
- case PIC16ISD::PIC16StopPoint: return "PIC16ISD::PIC16StopPoint";
}
}
return LowerBR_CC(Op, DAG);
case ISD::SELECT_CC:
return LowerSELECT_CC(Op, DAG);
- case ISD::DBG_STOPPOINT:
- return LowerStopPoint(Op, DAG);
}
return SDValue();
}
-SDValue PIC16TargetLowering::LowerStopPoint(SDValue Op, SelectionDAG &DAG) {
- DbgStopPointSDNode *SP = dyn_cast<DbgStopPointSDNode>(Op);
- unsigned line = SP->getLine();
- SDValue LineNode = DAG.getConstant(line, MVT::i8);
- DebugLoc dl = Op.getDebugLoc();
- return DAG.getNode(PIC16ISD::PIC16StopPoint, dl, MVT::Other,
- Op.getOperand(0), LineNode);
-}
-
SDValue PIC16TargetLowering::ConvertToMemOperand(SDValue Op,
SelectionDAG &DAG,
DebugLoc dl) {
SUBCC, // Compare for equality or inequality.
SELECT_ICC, // Psuedo to be caught in schedular and expanded to brcond.
BRCOND, // Conditional branch.
- PIC16StopPoint,
Dummy
};
SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG);
SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG);
- SDValue LowerStopPoint(SDValue Op, SelectionDAG &DAG);
SDValue getPIC16Cmp(SDValue LHS, SDValue RHS, unsigned OrigCC, SDValue &CC,
SelectionDAG &DAG, DebugLoc dl);
virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
def PIC16callseq_end : SDNode<"ISD::CALLSEQ_END", SDTI8VoidOp,
[SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
-def PIC16StopPoint : SDNode<"PIC16ISD::PIC16StopPoint", SDTI8VoidOp,
- [SDNPHasChain]>;
-
// Low 8-bits of GlobalAddress.
def PIC16Lo : SDNode<"PIC16ISD::Lo", SDTI8UnaryOp>;
// PIC16 Instructions.
//===----------------------------------------------------------------------===//
-def line_directive : ByteFormat<0, (outs), (ins i8imm:$src),
- ".line $src",
- [(PIC16StopPoint (i8 imm:$src))]>;
-
// Pseudo-instructions.
def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i8imm:$amt),
"!ADJCALLSTACKDOWN $amt",
ReadOnlySection = getNamedSection("romdata.# ROMDATA", SectionFlags::None);
DataSection = getNamedSection("idata.# IDATA", SectionFlags::Writeable);
SwitchToSectionDirective = "";
+ // Need because otherwise a .text symbol is emitted by DwarfWriter
+ // in BeginModule, and gpasm cribbs for that .text symbol.
+ TextSection = getUnnamedSection("", SectionFlags::Code);
}
const char *PIC16TargetAsmInfo::getRomDirective(unsigned size) const