assert(C != '"' && "Illegal character in LLVM value name!");
if (isalnum(C) || C == '-' || C == '.' || C == '_')
result += C;
- else if (isprint(C)) {
+ else if (C == '\\') {
+ needsQuotes = true;
+ result += "\\\\";
+ } else if (isprint(C)) {
needsQuotes = true;
result += C;
} else {
const FunctionType *FTy = cast<FunctionType>(Ty);
calcTypeName(FTy->getReturnType(), TypeStack, TypeNames, Result);
Result += " (";
- unsigned Idx = 1;
- const ParamAttrsList *Attrs = FTy->getParamAttrs();
for (FunctionType::param_iterator I = FTy->param_begin(),
- E = FTy->param_end(); I != E; ++I) {
+ E = FTy->param_end(); I != E; ++I) {
if (I != FTy->param_begin())
Result += ", ";
calcTypeName(*I, TypeStack, TypeNames, Result);
- if (Attrs && Attrs->getParamAttrs(Idx) != ParamAttr::None) {
- Result += + " ";
- Result += Attrs->getParamAttrsTextByIndex(Idx);
- }
- Idx++;
}
if (FTy->isVarArg()) {
if (FTy->getNumParams()) Result += ", ";
Result += "...";
}
Result += ")";
- if (Attrs && Attrs->getParamAttrs(0) != ParamAttr::None) {
- Result += " ";
- Result += Attrs->getParamAttrsTextByIndex(0);
- }
break;
}
case Type::StructTyID: {
else
Out << CI->getValue().toStringSigned(10);
} else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) {
- // We would like to output the FP constant value in exponential notation,
- // but we cannot do this if doing so will lose precision. Check here to
- // make sure that we only output it in exponential format if we can parse
- // the value back and get the same value.
- //
- std::string StrVal = ftostr(CFP->getValue());
-
- // Check to make sure that the stringized number is not some string like
- // "Inf" or NaN, that atof will accept, but the lexer will not. Check that
- // the string matches the "[-+]?[0-9]" regex.
- //
- if ((StrVal[0] >= '0' && StrVal[0] <= '9') ||
- ((StrVal[0] == '-' || StrVal[0] == '+') &&
- (StrVal[1] >= '0' && StrVal[1] <= '9')))
- // Reparse stringized version!
- if (atof(StrVal.c_str()) == CFP->getValue()) {
- Out << StrVal;
- return;
+ if (&CFP->getValueAPF().getSemantics() == &APFloat::IEEEdouble ||
+ &CFP->getValueAPF().getSemantics() == &APFloat::IEEEsingle) {
+ // We would like to output the FP constant value in exponential notation,
+ // but we cannot do this if doing so will lose precision. Check here to
+ // make sure that we only output it in exponential format if we can parse
+ // the value back and get the same value.
+ //
+ bool isDouble = &CFP->getValueAPF().getSemantics()==&APFloat::IEEEdouble;
+ double Val = (isDouble) ? CFP->getValueAPF().convertToDouble() :
+ CFP->getValueAPF().convertToFloat();
+ std::string StrVal = ftostr(CFP->getValueAPF());
+
+ // Check to make sure that the stringized number is not some string like
+ // "Inf" or NaN, that atof will accept, but the lexer will not. Check
+ // that the string matches the "[-+]?[0-9]" regex.
+ //
+ if ((StrVal[0] >= '0' && StrVal[0] <= '9') ||
+ ((StrVal[0] == '-' || StrVal[0] == '+') &&
+ (StrVal[1] >= '0' && StrVal[1] <= '9'))) {
+ // Reparse stringized version!
+ if (atof(StrVal.c_str()) == Val) {
+ Out << StrVal;
+ return;
+ }
}
-
- // Otherwise we could not reparse it to exactly the same value, so we must
- // output the string in hexadecimal format!
- assert(sizeof(double) == sizeof(uint64_t) &&
- "assuming that double is 64 bits!");
- Out << "0x" << utohexstr(DoubleToBits(CFP->getValue()));
-
+ // Otherwise we could not reparse it to exactly the same value, so we must
+ // output the string in hexadecimal format!
+ assert(sizeof(double) == sizeof(uint64_t) &&
+ "assuming that double is 64 bits!");
+ Out << "0x" << utohexstr(DoubleToBits(Val));
+ } else {
+ // Some form of long double. These appear as a magic letter identifying
+ // the type, then a fixed number of hex digits.
+ Out << "0x";
+ if (&CFP->getValueAPF().getSemantics() == &APFloat::x87DoubleExtended)
+ Out << 'K';
+ else if (&CFP->getValueAPF().getSemantics() == &APFloat::IEEEquad)
+ Out << 'L';
+ else if (&CFP->getValueAPF().getSemantics() == &APFloat::PPCDoubleDouble)
+ Out << 'M';
+ else
+ assert(0 && "Unsupported floating point type");
+ // api needed to prevent premature destruction
+ APInt api = CFP->getValueAPF().convertToAPInt();
+ const uint64_t* p = api.getRawData();
+ uint64_t word = *p;
+ int shiftcount=60;
+ int width = api.getBitWidth();
+ for (int j=0; j<width; j+=4, shiftcount-=4) {
+ unsigned int nibble = (word>>shiftcount) & 15;
+ if (nibble < 10)
+ Out << (unsigned char)(nibble + '0');
+ else
+ Out << (unsigned char)(nibble - 10 + 'A');
+ if (shiftcount == 0) {
+ word = *(++p);
+ shiftcount = 64;
+ if (width-j-4 < 64)
+ shiftcount = width-j-4;
+ }
+ }
+ }
} else if (isa<ConstantAggregateZero>(CV)) {
Out << "zeroinitializer";
} else if (const ConstantArray *CA = dyn_cast<ConstantArray>(CV)) {
inline void write(const Type *Ty) { printType(Ty); }
void writeOperand(const Value *Op, bool PrintType);
+ void writeParamOperand(const Value *Operand, uint16_t Attrs);
const Module* getModule() { return TheModule; }
else if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
printType(FTy->getReturnType());
Out << " (";
- unsigned Idx = 1;
- const ParamAttrsList *Attrs = FTy->getParamAttrs();
for (FunctionType::param_iterator I = FTy->param_begin(),
E = FTy->param_end(); I != E; ++I) {
if (I != FTy->param_begin())
Out << ", ";
printType(*I);
- if (Attrs && Attrs->getParamAttrs(Idx) != ParamAttr::None) {
- Out << " " << Attrs->getParamAttrsTextByIndex(Idx);
- }
- Idx++;
}
if (FTy->isVarArg()) {
if (FTy->getNumParams()) Out << ", ";
Out << "...";
}
Out << ')';
- if (Attrs && Attrs->getParamAttrs(0) != ParamAttr::None)
- Out << ' ' << Attrs->getParamAttrsTextByIndex(0);
} else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
if (STy->isPacked())
Out << '<';
}
}
+void AssemblyWriter::writeParamOperand(const Value *Operand, uint16_t Attrs) {
+ if (Operand == 0) {
+ Out << "<null operand!>";
+ } else {
+ Out << ' ';
+ // Print the type
+ printType(Operand->getType());
+ // Print parameter attributes list
+ if (Attrs != ParamAttr::None)
+ Out << ' ' << ParamAttrsList::getParamAttrsText(Attrs);
+ // Print the operand
+ WriteAsOperandInternal(Out, Operand, TypeNames, &Machine);
+ }
+}
void AssemblyWriter::printModule(const Module *M) {
if (!M->getModuleIdentifier().empty() &&
if (AnnotationWriter) AnnotationWriter->emitFunctionAnnot(F, Out);
if (F->isDeclaration())
- switch (F->getLinkage()) {
- case GlobalValue::DLLImportLinkage: Out << "declare dllimport "; break;
- case GlobalValue::ExternalWeakLinkage: Out << "declare extern_weak "; break;
- default: Out << "declare ";
- }
- else {
+ Out << "declare ";
+ else
Out << "define ";
- 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::DLLImportLinkage: Out << "dllimport "; break;
- case GlobalValue::DLLExportLinkage: Out << "dllexport "; break;
- case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
- case GlobalValue::ExternalLinkage: break;
- case GlobalValue::GhostLinkage:
- cerr << "GhostLinkage not allowed in AsmWriter!\n";
- abort();
- }
- switch (F->getVisibility()) {
- default: assert(0 && "Invalid visibility style!");
- case GlobalValue::DefaultVisibility: break;
- case GlobalValue::HiddenVisibility: Out << "hidden "; break;
- case GlobalValue::ProtectedVisibility: Out << "protected "; break;
- }
+
+ 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::DLLImportLinkage: Out << "dllimport "; break;
+ case GlobalValue::DLLExportLinkage: Out << "dllexport "; break;
+ case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
+ case GlobalValue::ExternalLinkage: break;
+ case GlobalValue::GhostLinkage:
+ cerr << "GhostLinkage not allowed in AsmWriter!\n";
+ abort();
+ }
+ switch (F->getVisibility()) {
+ default: assert(0 && "Invalid visibility style!");
+ case GlobalValue::DefaultVisibility: break;
+ case GlobalValue::HiddenVisibility: Out << "hidden "; break;
+ case GlobalValue::ProtectedVisibility: Out << "protected "; break;
}
// Print the calling convention.
}
const FunctionType *FT = F->getFunctionType();
- const ParamAttrsList *Attrs = FT->getParamAttrs();
+ const ParamAttrsList *Attrs = F->getParamAttrs();
printType(F->getReturnType()) << ' ';
if (!F->getName().empty())
Out << getLLVMName(F->getName(), GlobalPrefix);
Out << " section \"" << F->getSection() << '"';
if (F->getAlignment())
Out << " align " << F->getAlignment();
+ if (F->hasCollector())
+ Out << " gc \"" << F->getCollector() << '"';
if (F->isDeclaration()) {
Out << "\n";
// Output type...
printType(Arg->getType());
+ // Output parameter attributes list
if (Attrs != ParamAttr::None)
Out << ' ' << ParamAttrsList::getParamAttrsText(Attrs);
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_StdCall: Out << " x86_stdcallcc"; break;
+ case CallingConv::X86_FastCall: Out << " x86_fastcallcc"; 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 ParamAttrsList *PAL = FTy->getParamAttrs();
+ const ParamAttrsList *PAL = CI->getParamAttrs();
// 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 << ',';
- writeOperand(I.getOperand(op), true);
- if (PAL && PAL->getParamAttrs(op) != ParamAttr::None)
- Out << " " << PAL->getParamAttrsTextByIndex(op);
+ writeParamOperand(I.getOperand(op), PAL ? PAL->getParamAttrs(op) : 0);
}
Out << " )";
if (PAL && PAL->getParamAttrs(0) != ParamAttr::None)
const PointerType *PTy = cast<PointerType>(Operand->getType());
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
const Type *RetTy = FTy->getReturnType();
- const ParamAttrsList *PAL = FTy->getParamAttrs();
+ const ParamAttrsList *PAL = II->getParamAttrs();
// Print the calling convention being used.
switch (II->getCallingConv()) {
for (unsigned op = 3, Eop = I.getNumOperands(); op < Eop; ++op) {
if (op > 3)
Out << ',';
- writeOperand(I.getOperand(op), true);
- if (PAL && PAL->getParamAttrs(op-2) != ParamAttr::None)
- Out << " " << PAL->getParamAttrsTextByIndex(op-2);
+ writeParamOperand(I.getOperand(op), PAL ? PAL->getParamAttrs(op-2) : 0);
}
Out << " )";