X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FAsmWriter.cpp;h=273fe3043aeb4210dfa644794b756252d6bc2bc8;hb=cef7527a85d026aeb17a4dacca73c70c0ab5da40;hp=1fb229be33c6da6787d0c4ca28688578e98a1cf1;hpb=0c8927efed7576d8992c3950601fc19394603a75;p=oota-llvm.git diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 1fb229be33c..273fe3043ae 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -68,58 +68,11 @@ static const Module *getModuleFromVal(const Value *V) { 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 += '"'; - } - 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); -} - enum PrefixType { GlobalPrefix, LabelPrefix, - LocalPrefix + LocalPrefix, + NoPrefix }; /// PrintLLVMName - Turn the specified name into an 'LLVM name', which is either @@ -130,6 +83,7 @@ static void PrintLLVMName(raw_ostream &OS, const char *NameStr, 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; @@ -158,28 +112,29 @@ static void PrintLLVMName(raw_ostream &OS, const char *NameStr, 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)) { + } else if (C != '"' && 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'); + OS << hexdigit((C >> 4) & 0x0F); + OS << hexdigit((C >> 0) & 0x0F); } } 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. @@ -385,7 +340,7 @@ int SlotTracker::getGlobalSlot(const GlobalValue *V) { // 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; } @@ -397,7 +352,7 @@ int SlotTracker::getLocalSlot(const Value *V) { initialize(); ValueMap::iterator FI = fMap.find(V); - return FI == fMap.end() ? -1 : FI->second; + return FI == fMap.end() ? -1 : (int)FI->second; } @@ -738,7 +693,7 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV, 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; @@ -1134,8 +1089,8 @@ void AssemblyWriter::writeParamOperand(const Value *Operand, // 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); @@ -1351,12 +1306,14 @@ void AssemblyWriter::printFunction(const Function *F) { 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()) @@ -1375,7 +1332,7 @@ void AssemblyWriter::printFunction(const Function *F) { 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 { @@ -1387,9 +1344,9 @@ void AssemblyWriter::printFunction(const Function *F) { // Output type... printType(FT->getParamType(i)); - Attributes 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); } } @@ -1399,9 +1356,9 @@ void AssemblyWriter::printFunction(const Function *F) { Out << "..."; // Output varargs portion of signature! } Out << ')'; - Attributes 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()) @@ -1411,34 +1368,6 @@ void AssemblyWriter::printFunction(const Function *F) { if (F->isDeclaration()) { Out << "\n"; } else { - - bool insideNotes = false; - if (F->hasNote(FnAttr::AlwaysInline)) { - Out << "notes("; - insideNotes = true; - Out << "inline=always"; - } - if (F->hasNote(FnAttr::NoInline)) { - if (insideNotes) - Out << ","; - else { - Out << "notes("; - insideNotes = true; - } - Out << "inline=never"; - } - if (F->hasNote(FnAttr::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 @@ -1460,8 +1389,8 @@ void AssemblyWriter::printArgument(const Argument *Arg, 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()) { @@ -1635,14 +1564,16 @@ void AssemblyWriter::printInstruction(const Instruction &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(Operand->getType()); const FunctionType *FTy = cast(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, @@ -1662,16 +1593,16 @@ void AssemblyWriter::printInstruction(const Instruction &I) { 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(&I)) { const PointerType *PTy = cast(Operand->getType()); const FunctionType *FTy = cast(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()) { @@ -1680,34 +1611,37 @@ void AssemblyWriter::printInstruction(const Instruction &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" << 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(RetTy) || !isa(cast(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 "; @@ -1830,7 +1764,7 @@ void Value::print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const { AssemblyWriter W(OS, SlotTable, GV->getParent(), 0); W.write(GV); } else if (const Constant *C = dyn_cast(this)) { - OS << ' ' << C->getType()->getDescription() << ' '; + OS << C->getType()->getDescription() << ' '; std::map TypeTable; WriteConstantInt(OS, C, TypeTable, 0); } else if (const Argument *A = dyn_cast(this)) { @@ -1855,6 +1789,14 @@ 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 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(); }