#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
+#include <iostream>
#include <set>
using namespace llvm;
void printMachineInstruction(const MachineInstr *MI);
void printOp(const MachineOperand &MO);
- void printOperand(const MachineInstr *MI, unsigned OpNo){
+ void printOperand(const MachineInstr *MI, unsigned OpNo) {
const MachineOperand &MO = MI->getOperand(OpNo);
if (MO.getType() == MachineOperand::MO_MachineRegister) {
assert(MRegisterInfo::isPhysicalRegister(MO.getReg())&&"Not physreg??");
printOp(MO);
}
}
-
+
+ bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
+ unsigned AsmVariant, const char *ExtraCode) {
+ printOperand(MI, OpNo);
+ return false;
+ }
+
void printU5ImmOperand(const MachineInstr *MI, unsigned OpNo) {
unsigned char value = MI->getOperand(OpNo).getImmedValue();
assert(value <= 31 && "Invalid u5imm argument!");
: DwarfWriter(o, ap)
{
needsSet = true;
- DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev,regular,debug";
- DwarfInfoSection = ".section __DWARFA,__debug_info,regular,debug";
- DwarfLineSection = ".section __DWARFA,__debug_line,regular,debug";
- DwarfFrameSection = ".section __DWARFA,__debug_frame,regular,debug";
- DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames,regular,debug";
- DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes,regular,debug";
- DwarfStrSection = ".section __DWARFA,__debug_str,regular,debug";
- DwarfLocSection = ".section __DWARFA,__debug_loc,regular,debug";
- DwarfARangesSection = ".section __DWARFA,__debug_aranges,regular,debug";
- DwarfRangesSection = ".section __DWARFA,__debug_ranges,regular,debug";
- DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo,regular,debug";
+ DwarfAbbrevSection = ".section __DWARF,__debug_abbrev";
+ DwarfInfoSection = ".section __DWARF,__debug_info";
+ DwarfLineSection = ".section __DWARF,__debug_line";
+ DwarfFrameSection =
+ ".section __DWARF,__debug_frame,,coalesced,no_toc+strip_static_syms";
+ DwarfPubNamesSection = ".section __DWARF,__debug_pubnames";
+ DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes";
+ DwarfStrSection = ".section __DWARF,__debug_str";
+ DwarfLocSection = ".section __DWARF,__debug_loc";
+ DwarfARangesSection = ".section __DWARF,__debug_aranges";
+ DwarfRangesSection = ".section __DWARF,__debug_ranges";
+ DwarfMacInfoSection = ".section __DWARF,__debug_macinfo";
TextSection = ".text";
DataSection = ".data";
}
/// DarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac OS
/// X
- ///
struct DarwinAsmPrinter : public PPCAsmPrinter {
DarwinDwarfWriter DW;
DarwinAsmPrinter(std::ostream &O, TargetMachine &TM)
- : PPCAsmPrinter(O, TM), DW(O, this)
- {
+ : PPCAsmPrinter(O, TM), DW(O, this) {
CommentString = ";";
GlobalPrefix = "_";
PrivateGlobalPrefix = "L"; // Marker for constant pool idxs
LCOMMDirective = "\t.lcomm\t";
StaticCtorsSection = ".mod_init_func";
StaticDtorsSection = ".mod_term_func";
+ InlineAsmStart = InlineAsmEnd = ""; // Don't use #APP/#NO_APP
}
virtual const char *getPassName() const {
O << ", " << (unsigned int)SH << "\n";
return;
}
+ } else if (MI->getOpcode() == PPC::OR4 || MI->getOpcode() == PPC::OR8) {
+ if (MI->getOperand(1).getReg() == MI->getOperand(2).getReg()) {
+ O << "mr ";
+ printOperand(MI, 0);
+ O << ", ";
+ printOperand(MI, 1);
+ O << "\n";
+ return;
+ }
}
if (printInstruction(MI))
/// method to print assembly for each instruction.
///
bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
- // FIXME - is this the earliest this can be set.
+ // FIXME - is this the earliest this can be set?
DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
SetupMachineFunction(MF);
O << "\n\n";
// Emit pre-function debug information.
- DW.BeginFunction();
+ DW.BeginFunction(MF);
// Print out constants referenced by the function
EmitConstantPool(MF.getConstantPool());
}
// Emit post-function debug information.
- DW.EndFunction();
+ DW.EndFunction(MF);
// We didn't modify anything.
return false;
Mang->setUseQuotes(true);
// Emit initial debug information.
- DW.BeginModule();
+ DW.BeginModule(M);
return false;
}
if (I->hasAppendingLinkage() && EmitSpecialLLVMGlobal(I))
continue;
- O << '\n';
std::string name = Mang->getValueName(I);
Constant *C = I->getInitializer();
unsigned Size = TD.getTypeSize(C->getType());
- unsigned Align = TD.getTypeAlignmentShift(C->getType());
+ unsigned Align = getPreferredAlignmentLog(I);
if (C->isNullValue() && /* FIXME: Verify correct */
(I->hasInternalLinkage() || I->hasWeakLinkage() ||
EmitAlignment(Align, I);
O << name << ":\t\t\t\t; '" << I->getName() << "'\n";
EmitGlobalConstant(C);
+ O << '\n';
}
}
}
// Emit initial debug information.
- DW.EndModule();
+ DW.EndModule(M);
// Funny Darwin hack: This flag tells the linker that no global symbols
// contain code that falls through to other global symbols (e.g. the obvious