// Make virtual table appear in this compilation unit.
AssemblyAnnotationWriter::~AssemblyAnnotationWriter() {}
-char PrintModulePass::ID = 0;
-static RegisterPass<PrintModulePass>
-X("printm", "Print module to stderr");
-char PrintFunctionPass::ID = 0;
-static RegisterPass<PrintFunctionPass>
-Y("print","Print function to stderr");
-
-
//===----------------------------------------------------------------------===//
// Helper Functions
//===----------------------------------------------------------------------===//
return 0;
}
-
-/// NameNeedsQuotes - Return true if the specified llvm name should be wrapped
-/// with ""'s.
-static std::string QuoteNameIfNeeded(const std::string &Name) {
- std::string result;
- bool needsQuotes = Name[0] >= '0' && Name[0] <= '9';
- // Scan the name to see if it needs quotes and to replace funky chars with
- // their octal equivalent.
- for (unsigned i = 0, e = Name.size(); i != e; ++i) {
- char C = Name[i];
- assert(C != '"' && "Illegal character in LLVM value name!");
- if (isalnum(C) || C == '-' || C == '.' || C == '_')
- result += C;
- else if (C == '\\') {
- needsQuotes = true;
- result += "\\\\";
- } else if (isprint(C)) {
- needsQuotes = true;
- result += C;
- } else {
- needsQuotes = true;
- result += "\\";
- char hex1 = (C >> 4) & 0x0F;
- if (hex1 < 10)
- result += hex1 + '0';
- else
- result += hex1 - 10 + 'A';
- char hex2 = C & 0x0F;
- if (hex2 < 10)
- result += hex2 + '0';
- else
- result += hex2 - 10 + 'A';
- }
- }
- if (needsQuotes) {
- result.insert(0,"\"");
- result += '"';
+// PrintEscapedString - Print each character of the specified string, escaping
+// it if it is not printable or if it is an escape char.
+static void PrintEscapedString(const char *Str, unsigned Length,
+ raw_ostream &Out) {
+ for (unsigned i = 0; i != Length; ++i) {
+ unsigned char C = Str[i];
+ if (isprint(C) && C != '\\' && C != '"' && isprint(C))
+ Out << C;
+ else
+ Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
}
- return result;
}
-/// getLLVMName - Turn the specified string into an 'LLVM name', which is
-/// surrounded with ""'s and escaped if it has special chars in it.
-static std::string getLLVMName(const std::string &Name) {
- assert(!Name.empty() && "Cannot get empty name!");
- return QuoteNameIfNeeded(Name);
+// PrintEscapedString - Print each character of the specified string, escaping
+// it if it is not printable or if it is an escape char.
+static void PrintEscapedString(const std::string &Str, raw_ostream &Out) {
+ PrintEscapedString(Str.c_str(), Str.size(), Out);
}
enum PrefixType {
GlobalPrefix,
LabelPrefix,
- LocalPrefix
+ LocalPrefix,
+ NoPrefix
};
/// PrintLLVMName - Turn the specified name into an 'LLVM name', which is either
assert(NameStr && "Cannot get empty name!");
switch (Prefix) {
default: assert(0 && "Bad prefix!");
+ case NoPrefix: break;
case GlobalPrefix: OS << '@'; break;
case LabelPrefix: break;
case LocalPrefix: OS << '%'; break;
}
// Scan the name to see if it needs quotes first.
- bool NeedsQuotes = NameStr[0] >= '0' && NameStr[0] <= '9';
+ bool NeedsQuotes = isdigit(NameStr[0]);
if (!NeedsQuotes) {
for (unsigned i = 0; i != NameLen; ++i) {
char C = NameStr[i];
// Okay, we need quotes. Output the quotes and escape any scary characters as
// needed.
OS << '"';
- for (unsigned i = 0; i != NameLen; ++i) {
- char C = NameStr[i];
- assert(C != '"' && "Illegal character in LLVM value name!");
- if (C == '\\') {
- OS << "\\\\";
- } else if (isprint(C)) {
- OS << C;
- } else {
- OS << '\\';
- char hex1 = (C >> 4) & 0x0F;
- if (hex1 < 10)
- OS << (char)(hex1 + '0');
- else
- OS << (char)(hex1 - 10 + 'A');
- char hex2 = C & 0x0F;
- if (hex2 < 10)
- OS << (char)(hex2 + '0');
- else
- OS << (char)(hex2 - 10 + 'A');
- }
- }
+ PrintEscapedString(NameStr, NameLen, OS);
OS << '"';
}
+/// getLLVMName - Turn the specified string into an 'LLVM name', which is
+/// surrounded with ""'s and escaped if it has special chars in it.
+static std::string getLLVMName(const std::string &Name) {
+ assert(!Name.empty() && "Cannot get empty name!");
+ std::string result;
+ raw_string_ostream OS(result);
+ PrintLLVMName(OS, Name.c_str(), Name.length(), NoPrefix);
+ return OS.str();
+}
+
/// PrintLLVMName - Turn the specified name into an 'LLVM name', which is either
/// prefixed with % (if the string only contains simple characters) or is
/// surrounded with ""'s (if it has special chars in it). Print it out.
// 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;
}
}
-// PrintEscapedString - Print each character of the specified string, escaping
-// it if it is not printable or if it is an escape char.
-static void PrintEscapedString(const std::string &Str, raw_ostream &Out) {
- for (unsigned i = 0, e = Str.size(); i != e; ++i) {
- unsigned char C = Str[i];
- if (isprint(C) && C != '"' && C != '\\') {
- Out << C;
- } else {
- Out << '\\'
- << (char) ((C/16 < 10) ? ( C/16 +'0') : ( C/16 -10+'A'))
- << (char)(((C&15) < 10) ? ((C&15)+'0') : ((C&15)-10+'A'));
- }
- }
-}
-
static const char *getPredicateText(unsigned predicate) {
const char * pred = "unknown";
switch (predicate) {
// output the string in hexadecimal format!
assert(sizeof(double) == sizeof(uint64_t) &&
"assuming that double is 64 bits!");
- Out << "0x" << utohexstr(DoubleToBits(Val));
+ char Buffer[40];
+ Out << "0x" << utohex_buffer(uint64_t(DoubleToBits(Val)), Buffer+40);
return;
}
else
assert(0 && "Unsupported floating point type");
// api needed to prevent premature destruction
- APInt api = CFP->getValueAPF().convertToAPInt();
+ APInt api = CFP->getValueAPF().bitcastToAPInt();
const uint64_t* p = api.getRawData();
uint64_t word = *p;
int shiftcount=60;
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);
}
void AssemblyWriter::writeParamOperand(const Value *Operand,
- ParameterAttributes Attrs) {
+ Attributes Attrs) {
if (Operand == 0) {
Out << "<null operand!>";
} else {
// 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);
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())
if (F->isDeclaration()) {
Out << "\n";
} else {
-
- bool insideNotes = false;
- if (F->hasNote(FN_NOTE_AlwaysInline)) {
- Out << "notes(";
- insideNotes = true;
- Out << "inline=always";
- }
- if (F->hasNote(FN_NOTE_NoInline)) {
- if (insideNotes)
- Out << ",";
- else {
- Out << "notes(";
- insideNotes = true;
- }
- Out << "inline=never";
- }
- if (F->hasNote(FN_NOTE_OptimizeForSize)) {
- if (insideNotes)
- Out << ",";
- else {
- Out << "notes(";
- insideNotes = true;
- }
- Out << "opt_size";
- }
- if (insideNotes)
- Out << ")";
-
Out << " {";
// Output all of its basic blocks... for the function
/// 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()) {
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,
for (unsigned op = 1, Eop = I.getNumOperands(); op < Eop; ++op) {
if (op > 1)
Out << ", ";
- writeParamOperand(I.getOperand(op), PAL.getParamAttrs(op));
+ writeParamOperand(I.getOperand(op), PAL.getParamAttributes(op));
}
Out << ')';
- if (PAL.getParamAttrs(0) != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(PAL.getParamAttrs(0));
+ 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::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" << 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 << ' ';
if (!FTy->isVarArg() &&
(!isa<PointerType>(RetTy) ||
!isa<FunctionType>(cast<PointerType>(RetTy)->getElementType()))) {
- Out << ' '; printType(RetTy);
+ printType(RetTy);
+ Out << ' ';
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));
+ writeParamOperand(I.getOperand(op), PAL.getParamAttributes(op-2));
}
Out << ')';
- if (PAL.getParamAttrs(0) != ParamAttr::None)
- Out << ' ' << ParamAttr::getAsString(PAL.getParamAttrs(0));
+ if (PAL.getFnAttributes() != Attribute::None)
+ Out << ' ' << Attribute::getAsString(PAL.getFnAttributes());
+
Out << "\n\t\t\tto ";
writeOperand(II->getNormalDest(), true);
Out << " unwind ";
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)) {
// 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 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 of Modules from the debugger.
void Module::dump() const { print(errs(), 0); errs().flush(); }