//
// The LLVM Compiler Infrastructure
//
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
#include "llvm/CallingConv.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
-#include "llvm/ParameterAttributes.h"
#include "llvm/InlineAsm.h"
#include "llvm/Instruction.h"
#include "llvm/Instructions.h"
/// @{
public:
/// @brief Construct from a module
- SlotMachine(const Module *M);
+ explicit SlotMachine(const Module *M);
/// @brief Construct from a function, starting out in incorp state.
- SlotMachine(const Function *F);
+ explicit SlotMachine(const Function *F);
/// @}
/// @name Accessors
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: {
Result += '>';
break;
}
- case Type::PointerTyID:
- calcTypeName(cast<PointerType>(Ty)->getElementType(),
+ case Type::PointerTyID: {
+ const PointerType *PTy = cast<PointerType>(Ty);
+ calcTypeName(PTy->getElementType(),
TypeStack, TypeNames, Result);
+ if (unsigned AddressSpace = PTy->getAddressSpace())
+ Result += " addrspace(" + utostr(AddressSpace) + ")";
Result += "*";
break;
+ }
case Type::ArrayTyID: {
const ArrayType *ATy = cast<ArrayType>(Ty);
Result += "[" + utostr(ATy->getNumElements()) + " x ";
Out << (unsigned char)(nibble + '0');
else
Out << (unsigned char)(nibble - 10 + 'A');
- if (shiftcount == 0) {
+ if (shiftcount == 0 && j+4 < width) {
word = *(++p);
shiftcount = 64;
if (width-j-4 < 64)
Out << "zeroinitializer";
} else if (const ConstantArray *CA = dyn_cast<ConstantArray>(CV)) {
// As a special case, print the array as a string if it is an array of
- // ubytes or an array of sbytes with positive values.
+ // i8 with ConstantInt values.
//
const Type *ETy = CA->getType()->getElementType();
if (CA->isString()) {
Out << ", ";
}
+ if (CE->hasIndices()) {
+ const SmallVector<unsigned, 4> &Indices = CE->getIndices();
+ for (unsigned i = 0, e = Indices.size(); i != e; ++i)
+ Out << ", " << Indices[i];
+ }
+
if (CE->isCast()) {
Out << " to ";
printTypeInt(Out, CE->getType(), TypeTable);
inline void write(const Type *Ty) { printType(Ty); }
void writeOperand(const Value *Op, bool PrintType);
+ void writeParamOperand(const Value *Operand, ParameterAttributes 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, uint16_t ParamAttrs);
+ void printArgument(const Argument *FA, ParameterAttributes Attrs);
void printBasicBlock(const BasicBlock *BB);
void printInstruction(const Instruction &I);
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 << '<';
if (STy->isPacked())
Out << '>';
} else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
- printType(PTy->getElementType()) << '*';
+ printType(PTy->getElementType());
+ if (unsigned AddressSpace = PTy->getAddressSpace())
+ Out << " addrspace(" << AddressSpace << ")";
+ Out << '*';
} else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
Out << '[' << ATy->getNumElements() << " x ";
printType(ATy->getElementType()) << ']';
}
}
+void AssemblyWriter::writeParamOperand(const Value *Operand,
+ ParameterAttributes Attrs) {
+ if (Operand == 0) {
+ Out << "<null operand!>";
+ } else {
+ Out << ' ';
+ // Print the type
+ printType(Operand->getType());
+ // Print parameter attributes list
+ if (Attrs != ParamAttr::None)
+ Out << ' ' << ParamAttr::getAsString(Attrs);
+ // Print the operand
+ WriteAsOperandInternal(Out, Operand, TypeNames, &Machine);
+ }
+}
void AssemblyWriter::printModule(const Module *M) {
if (!M->getModuleIdentifier().empty() &&
void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
if (GV->hasName()) Out << getLLVMName(GV->getName(), GlobalPrefix) << " = ";
- if (!GV->hasInitializer())
+ if (!GV->hasInitializer()) {
switch (GV->getLinkage()) {
case GlobalValue::DLLImportLinkage: Out << "dllimport "; break;
case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
default: Out << "external "; break;
- } else {
+ }
+ } else {
switch (GV->getLinkage()) {
case GlobalValue::InternalLinkage: Out << "internal "; break;
+ case GlobalValue::CommonLinkage: Out << "common "; break;
case GlobalValue::LinkOnceLinkage: Out << "linkonce "; break;
case GlobalValue::WeakLinkage: Out << "weak "; break;
case GlobalValue::AppendingLinkage: Out << "appending "; break;
writeOperand(GV->getInitializer(), false);
}
+ if (unsigned AddressSpace = GV->getType()->getAddressSpace())
+ Out << " addrspace(" << AddressSpace << ") ";
+
if (GV->hasSection())
Out << ", section \"" << GV->getSection() << '"';
if (GV->getAlignment())
}
void AssemblyWriter::printAlias(const GlobalAlias *GA) {
- Out << getLLVMName(GA->getName(), GlobalPrefix) << " = ";
+ // Don't crash when dumping partially built GA
+ if (!GA->hasName())
+ Out << "<<nameless>> = ";
+ else
+ Out << getLLVMName(GA->getName(), GlobalPrefix) << " = ";
switch (GA->getVisibility()) {
default: assert(0 && "Invalid visibility style!");
case GlobalValue::DefaultVisibility: break;
Out << getLLVMName(F->getName(), GlobalPrefix);
else
Out << "@\"\"";
+ } else if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(Aliasee)) {
+ printType(GA->getType());
+ Out << " " << getLLVMName(GA->getName(), GlobalPrefix);
} else {
const ConstantExpr *CE = 0;
if ((CE = dyn_cast<ConstantExpr>(Aliasee)) &&
case GlobalValue::InternalLinkage: Out << "internal "; break;
case GlobalValue::LinkOnceLinkage: Out << "linkonce "; break;
case GlobalValue::WeakLinkage: Out << "weak "; break;
+ case GlobalValue::CommonLinkage: Out << "common "; break;
case GlobalValue::AppendingLinkage: Out << "appending "; break;
case GlobalValue::DLLImportLinkage: Out << "dllimport "; break;
case GlobalValue::DLLExportLinkage: Out << "dllexport "; break;
}
const FunctionType *FT = F->getFunctionType();
- const ParamAttrsList *Attrs = FT->getParamAttrs();
+ const PAListPtr &Attrs = F->getParamAttrs();
printType(F->getReturnType()) << ' ';
if (!F->getName().empty())
Out << getLLVMName(F->getName(), GlobalPrefix);
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 ? Attrs->getParamAttrs(Idx)
- : uint16_t(ParamAttr::None)));
+ printArgument(I, Attrs.getParamAttrs(Idx));
Idx++;
}
} else {
// Output type...
printType(FT->getParamType(i));
- unsigned ArgAttrs = ParamAttr::None;
- if (Attrs) ArgAttrs = Attrs->getParamAttrs(i+1);
+ ParameterAttributes ArgAttrs = Attrs.getParamAttrs(i+1);
if (ArgAttrs != ParamAttr::None)
- Out << ' ' << ParamAttrsList::getParamAttrsText(ArgAttrs);
+ Out << ' ' << ParamAttr::getAsString(ArgAttrs);
}
}
Out << "..."; // Output varargs portion of signature!
}
Out << ')';
- if (Attrs && Attrs->getParamAttrs(0) != ParamAttr::None)
- Out << ' ' << Attrs->getParamAttrsTextByIndex(0);
+ ParameterAttributes RetAttrs = Attrs.getParamAttrs(0);
+ if (RetAttrs != ParamAttr::None)
+ Out << ' ' << ParamAttr::getAsString(Attrs.getParamAttrs(0));
if (F->hasSection())
Out << " section \"" << F->getSection() << '"';
if (F->getAlignment())
Out << " align " << F->getAlignment();
+ if (F->hasCollector())
+ Out << " gc \"" << F->getCollector() << '"';
if (F->isDeclaration()) {
Out << "\n";
/// printArgument - This member is called for every argument that is passed into
/// the function. Simply print it out
///
-void AssemblyWriter::printArgument(const Argument *Arg, uint16_t Attrs) {
+void AssemblyWriter::printArgument(const Argument *Arg,
+ ParameterAttributes Attrs) {
// Output type...
printType(Arg->getType());
+ // Output parameter attributes list
if (Attrs != ParamAttr::None)
- Out << ' ' << ParamAttrsList::getParamAttrsText(Attrs);
+ Out << ' ' << ParamAttr::getAsString(Attrs);
// Output name, if available...
if (Arg->hasName())
if (BB->getParent() == 0)
Out << "\t\t; Error: Block without parent!";
- else {
- if (BB != &BB->getParent()->getEntryBlock()) { // Not the entry block?
- // Output predecessors for the block...
- Out << "\t\t;";
- pred_const_iterator PI = pred_begin(BB), PE = pred_end(BB);
-
- if (PI == PE) {
- Out << " No predecessors!";
- } else {
- Out << " preds =";
+ else if (BB != &BB->getParent()->getEntryBlock()) { // Not the entry block?
+ // Output predecessors for the block...
+ Out << "\t\t;";
+ pred_const_iterator PI = pred_begin(BB), PE = pred_end(BB);
+
+ if (PI == PE) {
+ Out << " No predecessors!";
+ } else {
+ Out << " preds =";
+ writeOperand(*PI, false);
+ for (++PI; PI != PE; ++PI) {
+ Out << ',';
writeOperand(*PI, false);
- for (++PI; PI != PE; ++PI) {
- Out << ',';
- writeOperand(*PI, false);
- }
}
}
}
Out << I.getOpcodeName();
// Print out the compare instruction predicates
- if (const FCmpInst *FCI = dyn_cast<FCmpInst>(&I)) {
- Out << " " << getPredicateText(FCI->getPredicate());
- } else if (const ICmpInst *ICI = dyn_cast<ICmpInst>(&I)) {
- Out << " " << getPredicateText(ICI->getPredicate());
- }
+ if (const CmpInst *CI = dyn_cast<CmpInst>(&I))
+ Out << " " << getPredicateText(CI->getPredicate());
// Print out the type of the operands...
const Value *Operand = I.getNumOperands() ? I.getOperand(0) : 0;
writeOperand(I.getOperand(op ), false); Out << ',';
writeOperand(I.getOperand(op+1), false); Out << " ]";
}
+ } else if (const GetResultInst *GRI = dyn_cast<GetResultInst>(&I)) {
+ writeOperand(I.getOperand(0), true);
+ Out << ", " << GRI->getIndex();
+ } else if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(&I)) {
+ writeOperand(I.getOperand(0), true);
+ for (const unsigned *i = EVI->idx_begin(), *e = EVI->idx_end(); i != e; ++i)
+ Out << ", " << *i;
+ } else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(&I)) {
+ writeOperand(I.getOperand(0), true); Out << ',';
+ writeOperand(I.getOperand(1), true);
+ for (const unsigned *i = IVI->idx_begin(), *e = IVI->idx_end(); i != e; ++i)
+ Out << ", " << *i;
} else if (isa<ReturnInst>(I) && !Operand) {
Out << " void";
} else if (const CallInst *CI = dyn_cast<CallInst>(&I)) {
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 PAListPtr &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.getParamAttrs(op));
}
Out << " )";
- if (PAL && PAL->getParamAttrs(0) != ParamAttr::None)
- Out << ' ' << PAL->getParamAttrsTextByIndex(0);
+ if (PAL.getParamAttrs(0) != ParamAttr::None)
+ Out << ' ' << ParamAttr::getAsString(PAL.getParamAttrs(0));
} 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 ParamAttrsList *PAL = FTy->getParamAttrs();
+ const PAListPtr &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.getParamAttrs(op-2));
}
Out << " )";
- if (PAL && PAL->getParamAttrs(0) != ParamAttr::None)
- Out << " " << PAL->getParamAttrsTextByIndex(0);
+ if (PAL.getParamAttrs(0) != ParamAttr::None)
+ Out << " " << ParamAttr::getAsString(PAL.getParamAttrs(0));
Out << "\n\t\t\tto";
writeOperand(II->getNormalDest(), true);
Out << " unwind";
const Type *TheType = Operand->getType();
// Select, Store and ShuffleVector always print all types.
- if (isa<SelectInst>(I) || isa<StoreInst>(I) || isa<ShuffleVectorInst>(I)) {
+ if (isa<SelectInst>(I) || isa<StoreInst>(I) || isa<ShuffleVectorInst>(I)
+ || isa<ReturnInst>(I)) {
PrintAllTypes = true;
} else {
for (unsigned i = 1, E = I.getNumOperands(); i != E; ++i) {
// Located here because so much of the needed functionality is here.
void Type::dump() const { print(*cerr.stream()); cerr << '\n'; }
-void
-ParamAttrsList::dump() const {
- cerr << "PAL[ ";
- for (unsigned i = 0; i < attrs.size(); ++i) {
- uint16_t index = getParamIndex(i);
- uint16_t attrs = getParamAttrs(index);
- cerr << "{" << index << "," << attrs << "} ";
- }
- cerr << "]\n";
-}
-
//===----------------------------------------------------------------------===//
// SlotMachine Implementation
//===----------------------------------------------------------------------===//