#include "llvm/InlineAsm.h"
#include "llvm/Instruction.h"
#include "llvm/Instructions.h"
-#include "llvm/MDNode.h"
+#include "llvm/Operator.h"
+#include "llvm/Metadata.h"
#include "llvm/Module.h"
#include "llvm/ValueSymbolTable.h"
#include "llvm/TypeSymbolTable.h"
#include "llvm/Support/CFG.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
-#include "llvm/Support/Streams.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cctype>
// 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];
+static void PrintEscapedString(const StringRef &Name, raw_ostream &Out) {
+ for (unsigned i = 0, e = Name.size(); i != e; ++i) {
+ unsigned char C = Name[i];
if (isprint(C) && C != '\\' && C != '"')
Out << C;
else
}
}
-// 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,
/// 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.
-static void PrintLLVMName(raw_ostream &OS, const char *NameStr,
- unsigned NameLen, PrefixType Prefix) {
- assert(NameStr && "Cannot get empty name!");
+static void PrintLLVMName(raw_ostream &OS, const StringRef &Name,
+ PrefixType Prefix) {
+ assert(Name.data() && "Cannot get empty name!");
switch (Prefix) {
- default: assert(0 && "Bad prefix!");
+ default: llvm_unreachable("Bad prefix!");
case NoPrefix: break;
case GlobalPrefix: OS << '@'; break;
case LabelPrefix: break;
}
// Scan the name to see if it needs quotes first.
- bool NeedsQuotes = isdigit(NameStr[0]);
+ bool NeedsQuotes = isdigit(Name[0]);
if (!NeedsQuotes) {
- for (unsigned i = 0; i != NameLen; ++i) {
- char C = NameStr[i];
+ for (unsigned i = 0, e = Name.size(); i != e; ++i) {
+ char C = Name[i];
if (!isalnum(C) && C != '-' && C != '.' && C != '_') {
NeedsQuotes = true;
break;
// If we didn't need any quotes, just write out the name in one blast.
if (!NeedsQuotes) {
- OS.write(NameStr, NameLen);
+ OS << Name;
return;
}
// Okay, we need quotes. Output the quotes and escape any scary characters as
// needed.
OS << '"';
- PrintEscapedString(NameStr, NameLen, OS);
+ PrintEscapedString(Name, OS);
OS << '"';
}
/// prefixed with % (if the string only contains simple characters) or is
/// surrounded with ""'s (if it has special chars in it). Print it out.
static void PrintLLVMName(raw_ostream &OS, const Value *V) {
- PrintLLVMName(OS, V->getNameStart(), V->getNameLen(),
+ PrintLLVMName(OS, V->getName(),
isa<GlobalValue>(V) ? GlobalPrefix : LocalPrefix);
}
// Get the name as a string and insert it into TypeNames.
std::string NameStr;
raw_string_ostream NameOS(NameStr);
- PrintLLVMName(NameOS, TI->first.c_str(), TI->first.length(), LocalPrefix);
+ PrintLLVMName(NameOS, TI->first, LocalPrefix);
TP.addTypeName(Ty, NameOS.str());
}
/// TheMDNode - The MDNode for which we are holding slot numbers.
const MDNode *TheMDNode;
+ /// TheNamedMDNode - The MDNode for which we are holding slot numbers.
+ const NamedMDNode *TheNamedMDNode;
+
/// mMap - The TypePlanes map for the module level data.
ValueMap mMap;
unsigned mNext;
explicit SlotTracker(const Function *F);
/// Construct from a mdnode.
explicit SlotTracker(const MDNode *N);
+ /// Construct from a named mdnode.
+ explicit SlotTracker(const NamedMDNode *N);
/// Return the slot number of the specified value in it's type
/// plane. If something is not in the SlotTracker, return -1.
/// Add all MDNode operands.
void processMDNode();
+ /// Add all MDNode operands.
+ void processNamedMDNode();
+
SlotTracker(const SlotTracker &); // DO NOT IMPLEMENT
void operator=(const SlotTracker &); // DO NOT IMPLEMENT
};
}
#if 0
-#define ST_DEBUG(X) cerr << X
+#define ST_DEBUG(X) errs() << X
#else
#define ST_DEBUG(X)
#endif
// to be added to the slot table.
SlotTracker::SlotTracker(const Module *M)
: TheModule(M), TheFunction(0), FunctionProcessed(false), TheMDNode(0),
- mNext(0), fNext(0), mdnNext(0) {
+ TheNamedMDNode(0), mNext(0), fNext(0), mdnNext(0) {
}
// Function level constructor. Causes the contents of the Module and the one
// function provided to be added to the slot table.
SlotTracker::SlotTracker(const Function *F)
: TheModule(F ? F->getParent() : 0), TheFunction(F), FunctionProcessed(false),
- TheMDNode(0), mNext(0), fNext(0) {
+ TheMDNode(0), TheNamedMDNode(0), mNext(0), fNext(0), mdnNext(0) {
}
// Constructor to handle single MDNode.
SlotTracker::SlotTracker(const MDNode *C)
: TheModule(0), TheFunction(0), FunctionProcessed(false), TheMDNode(C),
- mNext(0), fNext(0), mdnNext(0) {
+ TheNamedMDNode(0), mNext(0), fNext(0), mdnNext(0) {
+}
+
+// Constructor to handle single NamedMDNode.
+SlotTracker::SlotTracker(const NamedMDNode *N)
+ : TheModule(0), TheFunction(0), FunctionProcessed(false), TheMDNode(0),
+ TheNamedMDNode(N), mNext(0), fNext(0), mdnNext(0) {
}
inline void SlotTracker::initialize() {
if (TheMDNode)
processMDNode();
+
+ if (TheNamedMDNode)
+ processNamedMDNode();
}
// Iterate through all the global variables, functions, and global
}
}
+ // Add metadata used by named metadata.
+ for (Module::const_named_metadata_iterator
+ I = TheModule->named_metadata_begin(),
+ E = TheModule->named_metadata_end(); I != E; ++I) {
+ const NamedMDNode *NMD = I;
+ for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) {
+ MDNode *MD = dyn_cast_or_null<MDNode>(NMD->getElement(i));
+ if (MD)
+ CreateMetadataSlot(MD);
+ }
+ }
+
// Add all the unnamed functions to the table.
for (Module::const_iterator I = TheModule->begin(), E = TheModule->end();
I != E; ++I)
ST_DEBUG("end processMDNode!\n");
}
+/// processNamedMDNode - Process TheNamedMDNode.
+void SlotTracker::processNamedMDNode() {
+ ST_DEBUG("begin processNamedMDNode!\n");
+ mdnNext = 0;
+ for (unsigned i = 0, e = TheNamedMDNode->getNumElements(); i != e; ++i) {
+ MDNode *MD = dyn_cast_or_null<MDNode>(TheNamedMDNode->getElement(i));
+ if (MD)
+ CreateMetadataSlot(MD);
+ }
+ TheNamedMDNode = 0;
+ ST_DEBUG("end processNamedMDNode!\n");
+}
+
/// Clean up after incorporating a function. This is the only way to get out of
/// the function incorporation state that affects get*Slot/Create*Slot. Function
/// incorporation state is indicated by TheFunction != 0.
}
}
+static void WriteOptimizationInfo(raw_ostream &Out, const User *U) {
+ if (const OverflowingBinaryOperator *OBO =
+ dyn_cast<OverflowingBinaryOperator>(U)) {
+ if (OBO->hasNoUnsignedOverflow())
+ Out << " nuw";
+ if (OBO->hasNoSignedOverflow())
+ Out << " nsw";
+ } else if (const SDivOperator *Div = dyn_cast<SDivOperator>(U)) {
+ if (Div->isExact())
+ Out << " exact";
+ } else if (const GEPOperator *GEP = dyn_cast<GEPOperator>(U)) {
+ if (GEP->isInBounds())
+ Out << " inbounds";
+ }
+}
+
static void WriteConstantInt(raw_ostream &Out, const Constant *CV,
TypePrinting &TypePrinter, SlotTracker *Machine) {
if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
else if (&CFP->getValueAPF().getSemantics() == &APFloat::PPCDoubleDouble)
Out << 'M';
else
- assert(0 && "Unsupported floating point type");
+ llvm_unreachable("Unsupported floating point type");
// api needed to prevent premature destruction
APInt api = CFP->getValueAPF().bitcastToAPInt();
const uint64_t* p = api.getRawData();
return;
}
- if (const MDString *S = dyn_cast<MDString>(CV)) {
- Out << "!\"";
- PrintEscapedString(S->begin(), S->size(), Out);
- Out << '"';
- return;
- }
-
if (const MDNode *Node = dyn_cast<MDNode>(CV)) {
Out << "!" << Machine->getMetadataSlot(Node);
return;
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
Out << CE->getOpcodeName();
+ WriteOptimizationInfo(Out, CE);
if (CE->isCompare())
Out << ' ' << getPredicateText(CE->getPredicate());
Out << " (";
Out << '"';
return;
}
-
+
+ if (const MDNode *N = dyn_cast<MDNode>(V)) {
+ Out << '!' << Machine->getMetadataSlot(N);
+ return;
+ }
+
+ if (const MDString *MDS = dyn_cast<MDString>(V)) {
+ Out << "!\"";
+ PrintEscapedString(MDS->getString(), Out);
+ Out << '"';
+ return;
+ }
+
char Prefix = '%';
int Slot;
if (Machine) {
else if (const Function *F = dyn_cast<Function>(G))
printFunction(F);
else
- assert(0 && "Unknown global");
+ llvm_unreachable("Unknown global");
}
void write(const BasicBlock *BB) { printBasicBlock(BB); }
for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I)
printFunction(I);
+ // Output named metadata.
+ for (Module::const_named_metadata_iterator I = M->named_metadata_begin(),
+ E = M->named_metadata_end(); I != E; ++I) {
+ const NamedMDNode *NMD = I;
+ Out << "!" << NMD->getName() << " = !{";
+ for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) {
+ if (i) Out << ", ";
+ MDNode *MD = dyn_cast_or_null<MDNode>(NMD->getElement(i));
+ Out << '!' << Machine.getMetadataSlot(MD);
+ }
+ Out << "}\n";
+ }
+
+ // Output metadata.
WriteMDNodes(Out, TypePrinter, Machine);
}
static void PrintLinkage(GlobalValue::LinkageTypes LT, raw_ostream &Out) {
switch (LT) {
- case GlobalValue::PrivateLinkage: Out << "private "; break;
- case GlobalValue::InternalLinkage: Out << "internal "; break;
+ case GlobalValue::ExternalLinkage: break;
+ case GlobalValue::PrivateLinkage: Out << "private "; break;
+ case GlobalValue::LinkerPrivateLinkage: Out << "linker_private "; break;
+ case GlobalValue::InternalLinkage: Out << "internal "; break;
+ case GlobalValue::LinkOnceAnyLinkage: Out << "linkonce "; break;
+ case GlobalValue::LinkOnceODRLinkage: Out << "linkonce_odr "; break;
+ case GlobalValue::WeakAnyLinkage: Out << "weak "; break;
+ case GlobalValue::WeakODRLinkage: Out << "weak_odr "; 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;
+ case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
case GlobalValue::AvailableExternallyLinkage:
Out << "available_externally ";
break;
- case GlobalValue::LinkOnceAnyLinkage: Out << "linkonce "; break;
- case GlobalValue::LinkOnceODRLinkage: Out << "linkonce_odr "; break;
- case GlobalValue::WeakAnyLinkage: Out << "weak "; break;
- case GlobalValue::WeakODRLinkage: Out << "weak_odr "; 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;
- case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
- case GlobalValue::ExternalLinkage: break;
case GlobalValue::GhostLinkage:
- LLVM_UNREACHABLE("GhostLinkage not allowed in AsmWriter!");
+ llvm_unreachable("GhostLinkage not allowed in AsmWriter!");
}
}
static void PrintVisibility(GlobalValue::VisibilityTypes Vis,
raw_ostream &Out) {
switch (Vis) {
- default: assert(0 && "Invalid visibility style!");
+ default: llvm_unreachable("Invalid visibility style!");
case GlobalValue::DefaultVisibility: break;
case GlobalValue::HiddenVisibility: Out << "hidden "; break;
case GlobalValue::ProtectedVisibility: Out << "protected "; break;
for (TypeSymbolTable::const_iterator TI = ST.begin(), TE = ST.end();
TI != TE; ++TI) {
Out << '\t';
- PrintLLVMName(Out, &TI->first[0], TI->first.size(), LocalPrefix);
+ PrintLLVMName(Out, TI->first, LocalPrefix);
Out << " = type ";
// Make sure we print out at least one level of the type structure, so
void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
if (BB->hasName()) { // Print out the label if it exists...
Out << "\n";
- PrintLLVMName(Out, BB->getNameStart(), BB->getNameLen(), LabelPrefix);
+ PrintLLVMName(Out, BB->getName(), LabelPrefix);
Out << ':';
} else if (!BB->use_empty()) { // Don't print block # of no uses...
Out << "\n; <label>:";
if (AnnotationWriter) AnnotationWriter->emitBasicBlockStartAnnot(BB, Out);
// Output all of the instructions in the basic block...
- for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
+ for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
printInstruction(*I);
+ Out << '\n';
+ }
if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
}
// Print out the opcode...
Out << I.getOpcodeName();
+ // Print out optimization information.
+ WriteOptimizationInfo(Out, &I);
+
// Print out the compare instruction predicates
if (const CmpInst *CI = dyn_cast<CmpInst>(&I))
Out << ' ' << getPredicateText(CI->getPredicate());
}
printInfoComment(I);
- Out << '\n';
}
SlotTracker SlotTable(GV->getParent());
AssemblyWriter W(OS, SlotTable, GV->getParent(), AAW);
W.write(GV);
+ } else if (const MDString *MDS = dyn_cast<MDString>(this)) {
+ TypePrinting TypePrinter;
+ TypePrinter.print(MDS->getType(), OS);
+ OS << ' ';
+ OS << "!\"";
+ PrintEscapedString(MDS->getString(), OS);
+ OS << '"';
} else if (const MDNode *N = dyn_cast<MDNode>(this)) {
SlotTracker SlotTable(N);
TypePrinting TypePrinter;
SlotTable.initialize();
WriteMDNodes(OS, TypePrinter, SlotTable);
+ } else if (const NamedMDNode *N = dyn_cast<NamedMDNode>(this)) {
+ SlotTracker SlotTable(N);
+ TypePrinting TypePrinter;
+ SlotTable.initialize();
+ OS << "!" << N->getName() << " = !{";
+ for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) {
+ if (i) OS << ", ";
+ MDNode *MD = dyn_cast_or_null<MDNode>(N->getElement(i));
+ if (MD)
+ OS << '!' << SlotTable.getMetadataSlot(MD);
+ else
+ OS << "null";
+ }
+ OS << "}\n";
+ WriteMDNodes(OS, TypePrinter, SlotTable);
} else if (const Constant *C = dyn_cast<Constant>(this)) {
TypePrinting TypePrinter;
TypePrinter.print(C->getType(), OS);
} else if (isa<InlineAsm>(this)) {
WriteAsOperand(OS, this, true, 0);
} else {
- assert(0 && "Unknown value to print out!");
+ llvm_unreachable("Unknown value to print out!");
}
}