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
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;
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.
// 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;
}
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;
// 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)
// 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(); }