1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00

Move printing of target-indepedent DEBUG_VALUE comments

into AsmPrinter.  Target-dependent form is still generated
by FastISel and still handled in X86 code.

llvm-svn: 100596
This commit is contained in:
Dale Johannesen 2010-04-07 01:15:14 +00:00
parent ac90d47ea3
commit c0f9c29448
3 changed files with 79 additions and 52 deletions

View File

@ -434,7 +434,64 @@ static void EmitKill(const MachineInstr *MI, AsmPrinter &AP) {
AP.OutStreamer.AddBlankLine();
}
/// EmitDebugValueComment - This method handles the target-independent form
/// of DBG_VALUE, returning true if it was able to do so. A false return
/// means the target will need to handle MI in EmitInstruction.
static bool EmitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
char buf[100];
std::string Str = "\t";
Str += AP.MAI->getCommentString();
Str += "DEBUG_VALUE: ";
// This code handles only the 3-operand target-independent form.
if (MI->getNumOperands() != 3)
return false;
// cast away const; DIetc do not take const operands for some reason.
DIVariable V((MDNode*)(MI->getOperand(2).getMetadata()));
Str += V.getName();
Str += " <- ";
// Register or immediate value. Register 0 means undef.
if (MI->getOperand(0).isFPImm()) {
APFloat APF = APFloat(MI->getOperand(0).getFPImm()->getValueAPF());
if (MI->getOperand(0).getFPImm()->getType()->isFloatTy()) {
sprintf(buf, "%e", APF.convertToFloat());
Str += buf;
} else if (MI->getOperand(0).getFPImm()->getType()->isDoubleTy()) {
sprintf(buf, "%e", APF.convertToDouble());
Str += buf;
} else {
// There is no good way to print long double. Convert a copy to
// double. Ah well, it's only a comment.
bool ignored;
APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven,
&ignored);
Str += "(long double) ";
sprintf(buf, "%e", APF.convertToDouble());
Str += buf;
}
} else if (MI->getOperand(0).isImm()) {
sprintf(buf, "%lld", MI->getOperand(0).getImm());
Str += buf;
} else if (MI->getOperand(0).isReg()) {
if (MI->getOperand(0).getReg() == 0) {
// Suppress offset, it is not meaningful here.
Str += "undef";
// NOTE: Want this comment at start of line, don't emit with AddComment.
AP.OutStreamer.EmitRawText(Twine(Str));
return true;
}
Str += AP.TM.getRegisterInfo()->getName(MI->getOperand(0).getReg());
} else
llvm_unreachable("Unknown operand type");
Str += '+';
sprintf(buf, "%lld", MI->getOperand(1).getImm());
Str += buf;
// NOTE: Want this comment at start of line, don't emit with AddComment.
AP.OutStreamer.EmitRawText(Twine(Str));
return true;
}
/// EmitFunctionBody - This method emits the body and trailer for a
/// function.
@ -473,6 +530,12 @@ void AsmPrinter::EmitFunctionBody() {
case TargetOpcode::INLINEASM:
EmitInlineAsm(II);
break;
case TargetOpcode::DBG_VALUE:
if (isVerbose()) {
if (!EmitDebugValueComment(II, *this))
EmitInstruction(II);
}
break;
case TargetOpcode::IMPLICIT_DEF:
if (isVerbose()) EmitImplicitDef(II, *this);
break;
@ -1236,7 +1299,7 @@ static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace,
if (CFP->getType()->isX86_FP80Ty()) {
// all long double variants are printed as hex
// api needed to prevent premature destruction
// API needed to prevent premature destruction
APInt API = CFP->getValueAPF().bitcastToAPInt();
const uint64_t *p = API.getRawData();
if (AP.isVerbose()) {
@ -1266,8 +1329,8 @@ static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace,
assert(CFP->getType()->isPPC_FP128Ty() &&
"Floating point constant type not handled");
// All long double variants are printed as hex api needed to prevent
// premature destruction.
// All long double variants are printed as hex
// API needed to prevent premature destruction.
APInt API = CFP->getValueAPF().bitcastToAPInt();
const uint64_t *p = API.getRawData();
if (AP.TM.getTargetData()->isBigEndian()) {

View File

@ -332,6 +332,8 @@ bool FastISel::SelectCall(User *I) {
Value *Address = DI->getAddress();
if (!Address)
return true;
if (isa<UndefValue>(Address))
return true;
AllocaInst *AI = dyn_cast<AllocaInst>(Address);
// Don't handle byval struct arguments or VLAs, for example.
if (!AI) break;
@ -348,7 +350,7 @@ bool FastISel::SelectCall(User *I) {
return true;
}
case Intrinsic::dbg_value: {
// This requires target support, but right now X86 is the only Fast target.
// This form of DBG_VALUE is target-independent.
DbgValueInst *DI = cast<DbgValueInst>(I);
const TargetInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
Value *V = DI->getValue();

View File

@ -328,62 +328,24 @@ void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
void X86AsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
raw_ostream &O) {
// FIXME: if this is implemented for another target before it goes
// away completely, the common part should be moved into AsmPrinter.
O << '\t' << MAI->getCommentString() << "DEBUG_VALUE: ";
// Only the target-dependent form of DBG_VALUE should get here.
// Referencing the offset and metadata as NOps-2 and NOps-1 is
// probably portable to other targets; frame pointer location is not.
unsigned NOps = MI->getNumOperands();
assert(NOps==7);
O << '\t' << MAI->getCommentString() << "DEBUG_VALUE: ";
// cast away const; DIetc do not take const operands for some reason.
DIVariable V((MDNode*)(MI->getOperand(NOps-1).getMetadata()));
O << V.getName();
O << " <- ";
if (NOps==3) {
// Register or immediate value. Register 0 means undef.
assert(MI->getOperand(0).isReg() ||
MI->getOperand(0).isImm() ||
MI->getOperand(0).isFPImm());
if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg() == 0) {
// Suppress offset in this case, it is not meaningful.
O << "undef";
OutStreamer.AddBlankLine();
return;
}
if (MI->getOperand(0).isFPImm()) {
// This is more naturally done in printOperand, but since the only use
// of such an operand is in this comment and that is temporary (and it's
// ugly), we prefer to keep this localized.
// The include of Type.h may be removable when this code is.
if (MI->getOperand(0).getFPImm()->getType()->isFloatTy() ||
MI->getOperand(0).getFPImm()->getType()->isDoubleTy())
MI->getOperand(0).print(O, &TM);
else {
// There is no good way to print long double. Convert a copy to
// double. Ah well, it's only a comment.
bool ignored;
APFloat APF = APFloat(MI->getOperand(0).getFPImm()->getValueAPF());
APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven,
&ignored);
O << "(long double) " << APF.convertToDouble();
}
} else
printOperand(MI, 0, O);
} else {
if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg() == 0) {
// Suppress offset in this case, it is not meaningful.
O << "undef";
OutStreamer.AddBlankLine();
return;
}
// Frame address. Currently handles register +- offset only.
assert(MI->getOperand(0).isReg() && MI->getOperand(3).isImm());
O << '['; printOperand(MI, 0, O); O << '+'; printOperand(MI, 3, O);
O << ']';
}
// Frame address. Currently handles register +- offset only.
assert(MI->getOperand(0).isReg() && MI->getOperand(3).isImm());
O << '['; printOperand(MI, 0, O); O << '+'; printOperand(MI, 3, O);
O << ']';
O << "+";
printOperand(MI, NOps-2, O);
}
void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) {
X86MCInstLower MCInstLowering(OutContext, Mang, *this);
switch (MI->getOpcode()) {
@ -395,7 +357,7 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) {
OutStreamer.EmitRawText(StringRef(OS.str()));
}
return;
case X86::MOVPC32r: {
MCInst TmpInst;
// This is a pseudo op for a two instruction sequence with a label, which