char PrintModulePass::ID = 0;
static RegisterPass<PrintModulePass>
-X("printm", "Print module to stderr");
+X("print-module", "Print module to stderr");
char PrintFunctionPass::ID = 0;
static RegisterPass<PrintFunctionPass>
-Y("print","Print function to stderr");
+Y("print-function","Print function to stderr");
//===----------------------------------------------------------------------===//
// Find the type plane in the module map
ValueMap::iterator MI = mMap.find(V);
- return MI == mMap.end() ? -1 : MI->second;
+ return MI == mMap.end() ? -1 : (int)MI->second;
}
initialize();
ValueMap::iterator FI = fMap.find(V);
- return FI == fMap.end() ? -1 : FI->second;
+ return FI == fMap.end() ? -1 : (int)FI->second;
}
Result += "{ ";
for (StructType::element_iterator I = STy->element_begin(),
E = STy->element_end(); I != E; ++I) {
- if (I != STy->element_begin())
- Result += ", ";
calcTypeName(*I, TypeStack, TypeNames, Result);
+ if (next(I) != STy->element_end())
+ Result += ',';
+ Result += ' ';
}
- Result += " }";
+ Result += '}';
if (STy->isPacked())
Result += '>';
break;
if (CA->getNumOperands()) {
Out << ' ';
printTypeInt(Out, ETy, TypeTable);
+ Out << ' ';
WriteAsOperandInternal(Out, CA->getOperand(0),
TypeTable, Machine);
for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i) {
Out << ", ";
printTypeInt(Out, ETy, TypeTable);
+ Out << ' ';
WriteAsOperandInternal(Out, CA->getOperand(i), TypeTable, Machine);
}
+ Out << ' ';
}
- Out << " ]";
+ Out << ']';
}
return;
}
if (N) {
Out << ' ';
printTypeInt(Out, CS->getOperand(0)->getType(), TypeTable);
+ Out << ' ';
WriteAsOperandInternal(Out, CS->getOperand(0), TypeTable, Machine);
for (unsigned i = 1; i < N; i++) {
Out << ", ";
printTypeInt(Out, CS->getOperand(i)->getType(), TypeTable);
+ Out << ' ';
WriteAsOperandInternal(Out, CS->getOperand(i), TypeTable, Machine);
}
+ Out << ' ';
}
- Out << " }";
+ Out << '}';
if (CS->getType()->isPacked())
Out << '>';
return;
"Number of operands for a PackedConst must be > 0");
Out << "< ";
printTypeInt(Out, ETy, TypeTable);
+ Out << ' ';
WriteAsOperandInternal(Out, CP->getOperand(0), TypeTable, Machine);
for (unsigned i = 1, e = CP->getNumOperands(); i != e; ++i) {
Out << ", ";
printTypeInt(Out, ETy, TypeTable);
+ Out << ' ';
WriteAsOperandInternal(Out, CP->getOperand(i), TypeTable, Machine);
}
Out << " >";
for (User::const_op_iterator OI=CE->op_begin(); OI != CE->op_end(); ++OI) {
printTypeInt(Out, (*OI)->getType(), TypeTable);
+ Out << ' ';
WriteAsOperandInternal(Out, *OI, TypeTable, Machine);
if (OI+1 != CE->op_end())
Out << ", ";
static void WriteAsOperandInternal(raw_ostream &Out, const Value *V,
std::map<const Type*, std::string> &TypeTable,
SlotTracker *Machine) {
- Out << ' ';
if (V->hasName()) {
PrintLLVMName(Out, V);
return;
if (Context)
fillTypeNameTable(Context, TypeNames);
- if (PrintType)
+ if (PrintType) {
printTypeInt(Out, V->getType(), TypeNames);
+ Out << ' ';
+ }
WriteAsOperandInternal(Out, V, TypeNames, 0);
}
void write(const Type *Ty) { printType(Ty); }
void writeOperand(const Value *Op, bool PrintType);
- void writeParamOperand(const Value *Operand, ParameterAttributes Attrs);
+ void writeParamOperand(const Value *Operand, Attributes Attrs);
const Module* getModule() { return TheModule; }
void printGlobal(const GlobalVariable *GV);
void printAlias(const GlobalAlias *GV);
void printFunction(const Function *F);
- void printArgument(const Argument *FA, ParameterAttributes Attrs);
+ void printArgument(const Argument *FA, Attributes Attrs);
void printBasicBlock(const BasicBlock *BB);
void printInstruction(const Instruction &I);
Out << "<null operand!>";
} else {
if (PrintType) {
- Out << ' ';
printType(Operand->getType());
+ Out << ' ';
}
WriteAsOperandInternal(Out, Operand, TypeNames, &Machine);
}
}
void AssemblyWriter::writeParamOperand(const Value *Operand,
- ParameterAttributes Attrs) {
+ Attributes Attrs) {
if (Operand == 0) {
Out << "<null operand!>";
} else {
- Out << ' ';
// Print the type
printType(Operand->getType());
// Print parameter attributes list
- if (Attrs != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(Attrs);
+ if (Attrs != Attribute::None)
+ Out << ' ' << Attribute::getAsString(Attrs);
+ Out << ' ';
// Print the operand
WriteAsOperandInternal(Out, Operand, TypeNames, &Machine);
}
Out << (GV->isConstant() ? "constant " : "global ");
printType(GV->getType()->getElementType());
- if (GV->hasInitializer())
+ if (GV->hasInitializer()) {
+ Out << ' ';
writeOperand(GV->getInitializer(), false);
+ }
if (unsigned AddressSpace = GV->getType()->getAddressSpace())
Out << " addrspace(" << AddressSpace << ") ";
case CallingConv::Cold: Out << "coldcc "; break;
case CallingConv::X86_StdCall: Out << "x86_stdcallcc "; break;
case CallingConv::X86_FastCall: Out << "x86_fastcallcc "; break;
- case CallingConv::X86_SSECall: Out << "x86_ssecallcc "; break;
default: Out << "cc" << F->getCallingConv() << " "; break;
}
const FunctionType *FT = F->getFunctionType();
- const PAListPtr &Attrs = F->getParamAttrs();
+ const AttrListPtr &Attrs = F->getAttributes();
+ Attributes RetAttrs = Attrs.getRetAttributes();
+ if (RetAttrs != Attribute::None)
+ Out << Attribute::getAsString(Attrs.getRetAttributes()) << ' ';
printType(F->getReturnType());
Out << ' ';
if (F->hasName())
I != E; ++I) {
// Insert commas as we go... the first arg doesn't get a comma
if (I != F->arg_begin()) Out << ", ";
- printArgument(I, Attrs.getParamAttrs(Idx));
+ printArgument(I, Attrs.getParamAttributes(Idx));
Idx++;
}
} else {
// Output type...
printType(FT->getParamType(i));
- ParameterAttributes ArgAttrs = Attrs.getParamAttrs(i+1);
- if (ArgAttrs != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(ArgAttrs);
+ Attributes ArgAttrs = Attrs.getParamAttributes(i+1);
+ if (ArgAttrs != Attribute::None)
+ Out << ' ' << Attribute::getAsString(ArgAttrs);
}
}
Out << "..."; // Output varargs portion of signature!
}
Out << ')';
- ParameterAttributes RetAttrs = Attrs.getParamAttrs(0);
- if (RetAttrs != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(Attrs.getParamAttrs(0));
+ Attributes FnAttrs = Attrs.getFnAttributes();
+ if (FnAttrs != Attribute::None)
+ Out << ' ' << Attribute::getAsString(Attrs.getFnAttributes());
if (F->hasSection())
Out << " section \"" << F->getSection() << '"';
if (F->getAlignment())
Out << " align " << F->getAlignment();
if (F->hasGC())
Out << " gc \"" << F->getGC() << '"';
-
if (F->isDeclaration()) {
Out << "\n";
} else {
/// the function. Simply print it out
///
void AssemblyWriter::printArgument(const Argument *Arg,
- ParameterAttributes Attrs) {
+ Attributes Attrs) {
// Output type...
printType(Arg->getType());
// Output parameter attributes list
- if (Attrs != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(Attrs);
+ if (Attrs != Attribute::None)
+ Out << ' ' << Attribute::getAsString(Attrs);
// Output name, if available...
if (Arg->hasName()) {
if (PI == PE) {
Out << " No predecessors!";
} else {
- Out << " preds =";
+ Out << " preds = ";
writeOperand(*PI, false);
for (++PI; PI != PE; ++PI) {
- Out << ',';
+ Out << ", ";
writeOperand(*PI, false);
}
}
printType(V.getType());
Out << '>';
- if (!V.hasName()) {
+ if (!V.hasName() && !isa<Instruction>(V)) {
int SlotNum;
if (const GlobalValue *GV = dyn_cast<GlobalValue>(&V))
SlotNum = Machine.getGlobalSlot(GV);
void AssemblyWriter::printInstruction(const Instruction &I) {
if (AnnotationWriter) AnnotationWriter->emitInstructionAnnot(&I, Out);
- Out << "\t";
+ Out << '\t';
// Print out name if it exists...
if (I.hasName()) {
PrintLLVMName(Out, &I);
Out << " = ";
+ } else if (I.getType() != Type::VoidTy) {
+ // Print out the def slot taken.
+ int SlotNum = Machine.getLocalSlot(&I);
+ if (SlotNum == -1)
+ Out << "<badref> = ";
+ else
+ Out << '%' << SlotNum << " = ";
}
// If this is a volatile load or store, print out the volatile marker.
// Print out the compare instruction predicates
if (const CmpInst *CI = dyn_cast<CmpInst>(&I))
- Out << " " << getPredicateText(CI->getPredicate());
+ Out << ' ' << getPredicateText(CI->getPredicate());
// Print out the type of the operands...
const Value *Operand = I.getNumOperands() ? I.getOperand(0) : 0;
// Special case conditional branches to swizzle the condition out to the front
if (isa<BranchInst>(I) && I.getNumOperands() > 1) {
+ Out << ' ';
writeOperand(I.getOperand(2), true);
- Out << ',';
+ Out << ", ";
writeOperand(Operand, true);
- Out << ',';
+ Out << ", ";
writeOperand(I.getOperand(1), true);
} else if (isa<SwitchInst>(I)) {
// Special case switch statement to get formatting nice and correct...
- writeOperand(Operand , true); Out << ',';
- writeOperand(I.getOperand(1), true); Out << " [";
+ Out << ' ';
+ writeOperand(Operand , true);
+ Out << ", ";
+ writeOperand(I.getOperand(1), true);
+ Out << " [";
for (unsigned op = 2, Eop = I.getNumOperands(); op < Eop; op += 2) {
Out << "\n\t\t";
- writeOperand(I.getOperand(op ), true); Out << ',';
+ writeOperand(I.getOperand(op ), true);
+ Out << ", ";
writeOperand(I.getOperand(op+1), true);
}
Out << "\n\t]";
for (unsigned op = 0, Eop = I.getNumOperands(); op < Eop; op += 2) {
if (op) Out << ", ";
- Out << '[';
- writeOperand(I.getOperand(op ), false); Out << ',';
+ Out << "[ ";
+ writeOperand(I.getOperand(op ), false); Out << ", ";
writeOperand(I.getOperand(op+1), false); Out << " ]";
}
} else if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(&I)) {
+ Out << ' ';
writeOperand(I.getOperand(0), true);
for (const unsigned *i = EVI->idx_begin(), *e = EVI->idx_end(); i != e; ++i)
Out << ", " << *i;
} else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(&I)) {
- writeOperand(I.getOperand(0), true); Out << ',';
+ Out << ' ';
+ writeOperand(I.getOperand(0), true); Out << ", ";
writeOperand(I.getOperand(1), true);
for (const unsigned *i = IVI->idx_begin(), *e = IVI->idx_end(); i != e; ++i)
Out << ", " << *i;
case CallingConv::Cold: Out << " coldcc"; break;
case CallingConv::X86_StdCall: Out << " x86_stdcallcc"; break;
case CallingConv::X86_FastCall: Out << " x86_fastcallcc"; break;
- case CallingConv::X86_SSECall: Out << " x86_ssecallcc"; break;
default: Out << " cc" << CI->getCallingConv(); break;
}
const PointerType *PTy = cast<PointerType>(Operand->getType());
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
const Type *RetTy = FTy->getReturnType();
- const PAListPtr &PAL = CI->getParamAttrs();
+ const AttrListPtr &PAL = CI->getAttributes();
+
+ if (PAL.getRetAttributes() != Attribute::None)
+ Out << ' ' << Attribute::getAsString(PAL.getRetAttributes());
// If possible, print out the short form of the call instruction. We can
// only do this if the first argument is a pointer to a nonvararg function,
// and if the return type is not a pointer to a function.
//
+ Out << ' ';
if (!FTy->isVarArg() &&
(!isa<PointerType>(RetTy) ||
!isa<FunctionType>(cast<PointerType>(RetTy)->getElementType()))) {
- Out << ' '; printType(RetTy);
+ printType(RetTy);
+ Out << ' ';
writeOperand(Operand, false);
} else {
writeOperand(Operand, true);
Out << '(';
for (unsigned op = 1, Eop = I.getNumOperands(); op < Eop; ++op) {
if (op > 1)
- Out << ',';
- writeParamOperand(I.getOperand(op), PAL.getParamAttrs(op));
+ Out << ", ";
+ writeParamOperand(I.getOperand(op), PAL.getParamAttributes(op));
}
- Out << " )";
- if (PAL.getParamAttrs(0) != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(PAL.getParamAttrs(0));
+ Out << ')';
+ if (PAL.getFnAttributes() != Attribute::None)
+ Out << ' ' << Attribute::getAsString(PAL.getFnAttributes());
} else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I)) {
const PointerType *PTy = cast<PointerType>(Operand->getType());
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
const Type *RetTy = FTy->getReturnType();
- const PAListPtr &PAL = II->getParamAttrs();
+ const AttrListPtr &PAL = II->getAttributes();
// Print the calling convention being used.
switch (II->getCallingConv()) {
case CallingConv::C: break; // default
case CallingConv::Fast: Out << " fastcc"; break;
case CallingConv::Cold: Out << " coldcc"; break;
- case CallingConv::X86_StdCall: Out << "x86_stdcallcc "; break;
- case CallingConv::X86_FastCall: Out << "x86_fastcallcc "; break;
- case CallingConv::X86_SSECall: Out << "x86_ssecallcc "; break;
+ case CallingConv::X86_StdCall: Out << " x86_stdcallcc"; break;
+ case CallingConv::X86_FastCall: Out << " x86_fastcallcc"; break;
default: Out << " cc" << II->getCallingConv(); break;
}
+ if (PAL.getRetAttributes() != Attribute::None)
+ Out << ' ' << Attribute::getAsString(PAL.getRetAttributes());
+
// If possible, print out the short form of the invoke instruction. We can
// only do this if the first argument is a pointer to a nonvararg function,
// and if the return type is not a pointer to a function.
Out << ' '; printType(RetTy);
writeOperand(Operand, false);
} else {
+ Out << ' ';
writeOperand(Operand, true);
}
Out << '(';
for (unsigned op = 3, Eop = I.getNumOperands(); op < Eop; ++op) {
if (op > 3)
- Out << ',';
- writeParamOperand(I.getOperand(op), PAL.getParamAttrs(op-2));
+ Out << ", ";
+ writeParamOperand(I.getOperand(op), PAL.getParamAttributes(op-2));
}
- Out << " )";
- if (PAL.getParamAttrs(0) != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(PAL.getParamAttrs(0));
- Out << "\n\t\t\tto";
+ Out << ')';
+ if (PAL.getFnAttributes() != Attribute::None)
+ Out << ' ' << Attribute::getAsString(PAL.getFnAttributes());
+
+ Out << "\n\t\t\tto ";
writeOperand(II->getNormalDest(), true);
- Out << " unwind";
+ Out << " unwind ";
writeOperand(II->getUnwindDest(), true);
} else if (const AllocationInst *AI = dyn_cast<AllocationInst>(&I)) {
Out << ' ';
printType(AI->getType()->getElementType());
if (AI->isArrayAllocation()) {
- Out << ',';
+ Out << ", ";
writeOperand(AI->getArraySize(), true);
}
if (AI->getAlignment()) {
Out << ", align " << AI->getAlignment();
}
} else if (isa<CastInst>(I)) {
- if (Operand) writeOperand(Operand, true); // Work with broken code
+ if (Operand) {
+ Out << ' ';
+ writeOperand(Operand, true); // Work with broken code
+ }
Out << " to ";
printType(I.getType());
} else if (isa<VAArgInst>(I)) {
- if (Operand) writeOperand(Operand, true); // Work with broken code
+ if (Operand) {
+ Out << ' ';
+ writeOperand(Operand, true); // Work with broken code
+ }
Out << ", ";
printType(I.getType());
} else if (Operand) { // Print the normal way...
printType(TheType);
}
+ Out << ' ';
for (unsigned i = 0, E = I.getNumOperands(); i != E; ++i) {
- if (i) Out << ',';
+ if (i) Out << ", ";
writeOperand(I.getOperand(i), PrintAllTypes);
}
}
}
printInfoComment(I);
- Out << "\n";
+ Out << '\n';
}
AssemblyWriter W(OS, SlotTable, GV->getParent(), 0);
W.write(GV);
} else if (const Constant *C = dyn_cast<Constant>(this)) {
- OS << ' ' << C->getType()->getDescription() << ' ';
+ OS << C->getType()->getDescription() << ' ';
std::map<const Type *, std::string> TypeTable;
WriteConstantInt(OS, C, TypeTable, 0);
} else if (const Argument *A = dyn_cast<Argument>(this)) {
} else if (isa<InlineAsm>(this)) {
WriteAsOperand(OS, this, true, 0);
} else {
- assert(0 && "Unknown value to print out!");
+ // FIXME: PseudoSourceValue breaks this!
+ //assert(0 && "Unknown value to print out!");
}
}
print(OS, AAW);
}
-// Value::dump - allow easy printing of Values from the debugger.
-// Located here because so much of the needed functionality is here.
-void Value::dump() const { print(errs()); errs() << '\n'; }
+// Value::dump - allow easy printing of Values from the debugger.
+void Value::dump() const { print(errs()); errs() << '\n'; errs().flush(); }
+
+// Type::dump - allow easy printing of Types from the debugger.
+void Type::dump() const { print(errs()); errs() << '\n'; errs().flush(); }
-// Type::dump - allow easy printing of Values from the debugger.
-// Located here because so much of the needed functionality is here.
-void Type::dump() const { print(errs()); errs() << '\n'; }
+// Type::dump - allow easy printing of Types from the debugger.
+// This one uses type names from the given context module
+void Type::dump(const Module *Context) const {
+ WriteTypeSymbolic(errs(), this, Context);
+ errs() << '\n';
+ errs().flush();
+}
-// Module::dump() - Allow printing from debugger
-void Module::dump() const { print(errs(), 0); }
+// Module::dump() - Allow printing of Modules from the debugger.
+void Module::dump() const { print(errs(), 0); errs().flush(); }