aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisha Brukman <brukman+llvm@gmail.com>2004-04-28 19:24:28 +0000
committerMisha Brukman <brukman+llvm@gmail.com>2004-04-28 19:24:28 +0000
commite5242def97c52077b4e0a77a501f324867f7bce5 (patch)
tree62a843efe4222bf1d08be9497ffed9b71dcd9918
parentdf3d2e95a2606c607608252dd4069ae6feb14936 (diff)
downloadexternal_llvm-e5242def97c52077b4e0a77a501f324867f7bce5.tar.gz
external_llvm-e5242def97c52077b4e0a77a501f324867f7bce5.tar.bz2
external_llvm-e5242def97c52077b4e0a77a501f324867f7bce5.zip
class AssemblyWriter:
* Make contained ostream pointer, not reference * Allow setting of that ostream via setStream() class CachedWriter: * setStream() in turn calls setStream() on the AssemblyWriter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13247 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/VMCore/AsmWriter.cpp212
1 files changed, 109 insertions, 103 deletions
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp
index d3ae9027a7..533274a6d8 100644
--- a/lib/VMCore/AsmWriter.cpp
+++ b/lib/VMCore/AsmWriter.cpp
@@ -449,7 +449,7 @@ std::ostream &llvm::WriteAsOperand(std::ostream &Out, const Value *V,
namespace llvm {
class AssemblyWriter {
- std::ostream &Out;
+ std::ostream *Out;
SlotCalculator &Table;
const Module *TheModule;
std::map<const Type *, std::string> TypeNames;
@@ -457,7 +457,7 @@ class AssemblyWriter {
public:
inline AssemblyWriter(std::ostream &o, SlotCalculator &Tab, const Module *M,
AssemblyAnnotationWriter *AAW)
- : Out(o), Table(Tab), TheModule(M), AnnotationWriter(AAW) {
+ : Out(&o), Table(Tab), TheModule(M), AnnotationWriter(AAW) {
// If the module has a symbol table, take all global types and stuff their
// names into the TypeNames map.
@@ -476,6 +476,7 @@ public:
void writeOperand(const Value *Op, bool PrintType, bool PrintName = true);
const Module* getModule() { return TheModule; }
+ void setStream(std::ostream &os) { Out = &os; }
private :
void printModule(const Module *M);
@@ -491,7 +492,7 @@ private :
// symbolic version of a type name.
//
std::ostream &printType(const Type *Ty) {
- return printTypeInt(Out, Ty, TypeNames);
+ return printTypeInt(*Out, Ty, TypeNames);
}
// printTypeAtLeastOneLevel - Print out one level of the possibly complex type
@@ -514,55 +515,55 @@ std::ostream &AssemblyWriter::printTypeAtLeastOneLevel(const Type *Ty) {
for (FunctionType::param_iterator I = FTy->param_begin(),
E = FTy->param_end(); I != E; ++I) {
if (I != FTy->param_begin())
- Out << ", ";
+ *Out << ", ";
printType(*I);
}
if (FTy->isVarArg()) {
- if (FTy->getNumParams()) Out << ", ";
- Out << "...";
+ if (FTy->getNumParams()) *Out << ", ";
+ *Out << "...";
}
- Out << ")";
+ *Out << ")";
} else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
- Out << "{ ";
+ *Out << "{ ";
for (StructType::element_iterator I = STy->element_begin(),
E = STy->element_end(); I != E; ++I) {
if (I != STy->element_begin())
- Out << ", ";
+ *Out << ", ";
printType(*I);
}
- Out << " }";
+ *Out << " }";
} else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
printType(PTy->getElementType()) << "*";
} else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
- Out << "[" << ATy->getNumElements() << " x ";
+ *Out << "[" << ATy->getNumElements() << " x ";
printType(ATy->getElementType()) << "]";
} else if (const OpaqueType *OTy = dyn_cast<OpaqueType>(Ty)) {
- Out << "opaque";
+ *Out << "opaque";
} else {
if (!Ty->isPrimitiveType())
- Out << "<unknown derived type>";
+ *Out << "<unknown derived type>";
printType(Ty);
}
- return Out;
+ return *Out;
}
void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType,
bool PrintName) {
- if (PrintType) { Out << " "; printType(Operand->getType()); }
- WriteAsOperandInternal(Out, Operand, PrintName, TypeNames, &Table);
+ if (PrintType) { *Out << " "; printType(Operand->getType()); }
+ WriteAsOperandInternal(*Out, Operand, PrintName, TypeNames, &Table);
}
void AssemblyWriter::printModule(const Module *M) {
switch (M->getEndianness()) {
- case Module::LittleEndian: Out << "target endian = little\n"; break;
- case Module::BigEndian: Out << "target endian = big\n"; break;
+ case Module::LittleEndian: *Out << "target endian = little\n"; break;
+ case Module::BigEndian: *Out << "target endian = big\n"; break;
case Module::AnyEndianness: break;
}
switch (M->getPointerSize()) {
- case Module::Pointer32: Out << "target pointersize = 32\n"; break;
- case Module::Pointer64: Out << "target pointersize = 64\n"; break;
+ case Module::Pointer32: *Out << "target pointersize = 32\n"; break;
+ case Module::Pointer64: *Out << "target pointersize = 64\n"; break;
case Module::AnyPointerSize: break;
}
@@ -572,7 +573,7 @@ void AssemblyWriter::printModule(const Module *M) {
for (Module::const_giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
printGlobal(I);
- Out << "\nimplementation ; Functions:\n";
+ *Out << "\nimplementation ; Functions:\n";
// Output all of the functions...
for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I)
@@ -580,27 +581,27 @@ void AssemblyWriter::printModule(const Module *M) {
}
void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
- if (GV->hasName()) Out << getLLVMName(GV->getName()) << " = ";
+ if (GV->hasName()) *Out << getLLVMName(GV->getName()) << " = ";
if (!GV->hasInitializer())
- Out << "external ";
+ *Out << "external ";
else
switch (GV->getLinkage()) {
- case GlobalValue::InternalLinkage: Out << "internal "; break;
- case GlobalValue::LinkOnceLinkage: Out << "linkonce "; break;
- case GlobalValue::WeakLinkage: Out << "weak "; break;
- case GlobalValue::AppendingLinkage: Out << "appending "; break;
+ case GlobalValue::InternalLinkage: *Out << "internal "; break;
+ case GlobalValue::LinkOnceLinkage: *Out << "linkonce "; break;
+ case GlobalValue::WeakLinkage: *Out << "weak "; break;
+ case GlobalValue::AppendingLinkage: *Out << "appending "; break;
case GlobalValue::ExternalLinkage: break;
}
- Out << (GV->isConstant() ? "constant " : "global ");
+ *Out << (GV->isConstant() ? "constant " : "global ");
printType(GV->getType()->getElementType());
if (GV->hasInitializer())
writeOperand(GV->getInitializer(), false, false);
printInfoComment(*GV);
- Out << "\n";
+ *Out << "\n";
}
@@ -618,7 +619,7 @@ void AssemblyWriter::printSymbolTable(const SymbolTable &ST) {
printConstant(CPV);
} else if (const Type *Ty = dyn_cast<Type>(V)) {
assert(Ty->getType() == Type::TypeTy && TI->first == Type::TypeTy);
- Out << "\t" << getLLVMName(I->first) << " = type ";
+ *Out << "\t" << getLLVMName(I->first) << " = type ";
// Make sure we print out at least one level of the type structure, so
// that we do not get %FILE = type %FILE
@@ -637,40 +638,40 @@ void AssemblyWriter::printConstant(const Constant *CPV) {
if (!CPV->hasName()) return;
// Print out name...
- Out << "\t" << getLLVMName(CPV->getName()) << " =";
+ *Out << "\t" << getLLVMName(CPV->getName()) << " =";
// Write the value out now...
writeOperand(CPV, true, false);
printInfoComment(*CPV);
- Out << "\n";
+ *Out << "\n";
}
/// printFunction - Print all aspects of a function.
///
void AssemblyWriter::printFunction(const Function *F) {
// Print out the return type and name...
- Out << "\n";
+ *Out << "\n";
- if (AnnotationWriter) AnnotationWriter->emitFunctionAnnot(F, Out);
+ if (AnnotationWriter) AnnotationWriter->emitFunctionAnnot(F, *Out);
if (F->isExternal())
- Out << "declare ";
+ *Out << "declare ";
else
switch (F->getLinkage()) {
- case GlobalValue::InternalLinkage: Out << "internal "; break;
- case GlobalValue::LinkOnceLinkage: Out << "linkonce "; break;
- case GlobalValue::WeakLinkage: Out << "weak "; break;
- case GlobalValue::AppendingLinkage: Out << "appending "; break;
+ case GlobalValue::InternalLinkage: *Out << "internal "; break;
+ case GlobalValue::LinkOnceLinkage: *Out << "linkonce "; break;
+ case GlobalValue::WeakLinkage: *Out << "weak "; break;
+ case GlobalValue::AppendingLinkage: *Out << "appending "; break;
case GlobalValue::ExternalLinkage: break;
}
printType(F->getReturnType()) << " ";
if (!F->getName().empty())
- Out << getLLVMName(F->getName());
+ *Out << getLLVMName(F->getName());
else
- Out << "\"\"";
- Out << "(";
+ *Out << "\"\"";
+ *Out << "(";
Table.incorporateFunction(F);
// Loop over the arguments, printing them...
@@ -681,21 +682,21 @@ void AssemblyWriter::printFunction(const Function *F) {
// Finish printing arguments...
if (FT->isVarArg()) {
- if (FT->getNumParams()) Out << ", ";
- Out << "..."; // Output varargs portion of signature!
+ if (FT->getNumParams()) *Out << ", ";
+ *Out << "..."; // Output varargs portion of signature!
}
- Out << ")";
+ *Out << ")";
if (F->isExternal()) {
- Out << "\n";
+ *Out << "\n";
} else {
- Out << " {";
+ *Out << " {";
// Output all of its basic blocks... for the function
for (Function::const_iterator I = F->begin(), E = F->end(); I != E; ++I)
printBasicBlock(I);
- Out << "}\n";
+ *Out << "}\n";
}
Table.purgeFunction();
@@ -706,62 +707,62 @@ void AssemblyWriter::printFunction(const Function *F) {
///
void AssemblyWriter::printArgument(const Argument *Arg) {
// Insert commas as we go... the first arg doesn't get a comma
- if (Arg != &Arg->getParent()->afront()) Out << ", ";
+ if (Arg != &Arg->getParent()->afront()) *Out << ", ";
// Output type...
printType(Arg->getType());
// Output name, if available...
if (Arg->hasName())
- Out << " " << getLLVMName(Arg->getName());
+ *Out << " " << getLLVMName(Arg->getName());
else if (Table.getSlot(Arg) < 0)
- Out << "<badref>";
+ *Out << "<badref>";
}
/// printBasicBlock - This member is called for each basic block in a method.
///
void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
if (BB->hasName()) { // Print out the label if it exists...
- Out << "\n" << BB->getName() << ":";
+ *Out << "\n" << BB->getName() << ":";
} else if (!BB->use_empty()) { // Don't print block # of no uses...
int Slot = Table.getSlot(BB);
- Out << "\n; <label>:";
+ *Out << "\n; <label>:";
if (Slot >= 0)
- Out << Slot; // Extra newline separates out label's
+ *Out << Slot; // Extra newline separates out label's
else
- Out << "<badref>";
+ *Out << "<badref>";
}
if (BB->getParent() == 0)
- Out << "\t\t; Error: Block without parent!";
+ *Out << "\t\t; Error: Block without parent!";
else {
if (BB != &BB->getParent()->front()) { // Not the entry block?
// Output predecessors for the block...
- Out << "\t\t;";
+ *Out << "\t\t;";
pred_const_iterator PI = pred_begin(BB), PE = pred_end(BB);
if (PI == PE) {
- Out << " No predecessors!";
+ *Out << " No predecessors!";
} else {
- Out << " preds =";
+ *Out << " preds =";
writeOperand(*PI, false, true);
for (++PI; PI != PE; ++PI) {
- Out << ",";
+ *Out << ",";
writeOperand(*PI, false, true);
}
}
}
}
- Out << "\n";
+ *Out << "\n";
- if (AnnotationWriter) AnnotationWriter->emitBasicBlockStartAnnot(BB, Out);
+ if (AnnotationWriter) AnnotationWriter->emitBasicBlockStartAnnot(BB, *Out);
// Output all of the instructions in the basic block...
for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
printInstruction(*I);
- if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
+ if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, *Out);
}
@@ -770,36 +771,36 @@ void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
///
void AssemblyWriter::printInfoComment(const Value &V) {
if (V.getType() != Type::VoidTy) {
- Out << "\t\t; <";
+ *Out << "\t\t; <";
printType(V.getType()) << ">";
if (!V.hasName()) {
int Slot = Table.getSlot(&V); // Print out the def slot taken...
- if (Slot >= 0) Out << ":" << Slot;
- else Out << ":<badref>";
+ if (Slot >= 0) *Out << ":" << Slot;
+ else *Out << ":<badref>";
}
- Out << " [#uses=" << V.use_size() << "]"; // Output # uses
+ *Out << " [#uses=" << V.use_size() << "]"; // Output # uses
}
}
/// printInstruction - This member is called for each Instruction in a method.
///
void AssemblyWriter::printInstruction(const Instruction &I) {
- if (AnnotationWriter) AnnotationWriter->emitInstructionAnnot(&I, Out);
+ if (AnnotationWriter) AnnotationWriter->emitInstructionAnnot(&I, *Out);
- Out << "\t";
+ *Out << "\t";
// Print out name if it exists...
if (I.hasName())
- Out << getLLVMName(I.getName()) << " = ";
+ *Out << getLLVMName(I.getName()) << " = ";
// If this is a volatile load or store, print out the volatile marker
if ((isa<LoadInst>(I) && cast<LoadInst>(I).isVolatile()) ||
(isa<StoreInst>(I) && cast<StoreInst>(I).isVolatile()))
- Out << "volatile ";
+ *Out << "volatile ";
// Print out the opcode...
- Out << I.getOpcodeName();
+ *Out << I.getOpcodeName();
// Print out the type of the operands...
const Value *Operand = I.getNumOperands() ? I.getOperand(0) : 0;
@@ -807,35 +808,35 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
// Special case conditional branches to swizzle the condition out to the front
if (isa<BranchInst>(I) && I.getNumOperands() > 1) {
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 << " [";
+ 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 << ",";
+ *Out << "\n\t\t";
+ writeOperand(I.getOperand(op ), true); *Out << ",";
writeOperand(I.getOperand(op+1), true);
}
- Out << "\n\t]";
+ *Out << "\n\t]";
} else if (isa<PHINode>(I)) {
- Out << " ";
+ *Out << " ";
printType(I.getType());
- Out << " ";
+ *Out << " ";
for (unsigned op = 0, Eop = I.getNumOperands(); op < Eop; op += 2) {
- if (op) Out << ", ";
- Out << "[";
- writeOperand(I.getOperand(op ), false); Out << ",";
- writeOperand(I.getOperand(op+1), false); Out << " ]";
+ if (op) *Out << ", ";
+ *Out << "[";
+ writeOperand(I.getOperand(op ), false); *Out << ",";
+ writeOperand(I.getOperand(op+1), false); *Out << " ]";
}
} else if (isa<ReturnInst>(I) && !Operand) {
- Out << " void";
+ *Out << " void";
} else if (isa<CallInst>(I)) {
const PointerType *PTy = cast<PointerType>(Operand->getType());
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
@@ -848,19 +849,19 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
if (!FTy->isVarArg() &&
(!isa<PointerType>(RetTy) ||
!isa<FunctionType>(cast<PointerType>(RetTy)->getElementType()))) {
- Out << " "; printType(RetTy);
+ *Out << " "; printType(RetTy);
writeOperand(Operand, false);
} else {
writeOperand(Operand, true);
}
- Out << "(";
+ *Out << "(";
if (I.getNumOperands() > 1) writeOperand(I.getOperand(1), true);
for (unsigned op = 2, Eop = I.getNumOperands(); op < Eop; ++op) {
- Out << ",";
+ *Out << ",";
writeOperand(I.getOperand(op), true);
}
- Out << " )";
+ *Out << " )";
} else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I)) {
const PointerType *PTy = cast<PointerType>(Operand->getType());
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
@@ -873,42 +874,42 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
if (!FTy->isVarArg() &&
(!isa<PointerType>(RetTy) ||
!isa<FunctionType>(cast<PointerType>(RetTy)->getElementType()))) {
- Out << " "; printType(RetTy);
+ *Out << " "; printType(RetTy);
writeOperand(Operand, false);
} else {
writeOperand(Operand, true);
}
- Out << "(";
+ *Out << "(";
if (I.getNumOperands() > 3) writeOperand(I.getOperand(3), true);
for (unsigned op = 4, Eop = I.getNumOperands(); op < Eop; ++op) {
- Out << ",";
+ *Out << ",";
writeOperand(I.getOperand(op), true);
}
- Out << " )\n\t\t\tto";
+ *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 << " ";
+ *Out << " ";
printType(AI->getType()->getElementType());
if (AI->isArrayAllocation()) {
- Out << ",";
+ *Out << ",";
writeOperand(AI->getArraySize(), true);
}
} else if (isa<CastInst>(I)) {
if (Operand) writeOperand(Operand, true); // Work with broken code
- Out << " to ";
+ *Out << " to ";
printType(I.getType());
} else if (isa<VAArgInst>(I)) {
if (Operand) writeOperand(Operand, true); // Work with broken code
- Out << ", ";
+ *Out << ", ";
printType(I.getType());
} else if (const VANextInst *VAN = dyn_cast<VANextInst>(&I)) {
if (Operand) writeOperand(Operand, true); // Work with broken code
- Out << ", ";
+ *Out << ", ";
printType(VAN->getArgType());
} else if (Operand) { // Print the normal way...
@@ -933,18 +934,18 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
}
if (!PrintAllTypes) {
- Out << " ";
+ *Out << " ";
printType(TheType);
}
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";
}
@@ -1056,3 +1057,8 @@ CachedWriter& CachedWriter::operator<<(const Type *X) {
} else
return *this << (const Value*)X;
}
+
+void CachedWriter::setStream(std::ostream &os) {
+ Out = &os;
+ if (AW) AW->setStream(os);
+}