#include "llvm/Support/InstVisitor.h"
#include "llvm/Support/Mangler.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Config/config.h"
#include <algorithm>
std::set<const Type *> UT = getAnalysis<FindUsedTypes>().getTypes();
// Loop over the module symbol table, removing types from UT that are
- // already named, and removing names for structure types that are not used.
+ // already named, and removing names for types that are not used.
//
SymbolTable &MST = M.getSymbolTable();
for (SymbolTable::type_iterator TI = MST.type_begin(), TE = MST.type_end();
TI != TE; ) {
SymbolTable::type_iterator I = TI++;
- if (const StructType *STy = dyn_cast<StructType>(I->second)) {
- // If this is not used, remove it from the symbol table.
- std::set<const Type *>::iterator UTI = UT.find(STy);
- if (UTI == UT.end())
- MST.remove(I);
- else
- UT.erase(UTI);
- }
+
+ // If this is not used, remove it from the symbol table.
+ std::set<const Type *>::iterator UTI = UT.find(I->second);
+ if (UTI == UT.end())
+ MST.remove(I);
+ else
+ UT.erase(UTI); // Only keep one name for this type.
}
// UT now contains types that are not named. Loop over it, naming
printModuleTypes(M.getSymbolTable());
// Global variable declarations...
- if (!M.gempty()) {
+ if (!M.global_empty()) {
Out << "\n/* External Global Variable Declarations */\n";
- for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I) {
+ for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) {
if (I->hasExternalLinkage()) {
Out << "extern ";
printType(Out, I->getType()->getElementType(), Mang->getValueName(I));
}
// Output the global variable declarations
- if (!M.gempty()) {
+ if (!M.global_empty()) {
Out << "\n\n/* Global Variable Declarations */\n";
- for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
+ for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I)
if (!I->isExternal()) {
if (I->hasInternalLinkage())
Out << "static ";
}
// Output the global variable definitions and contents...
- if (!M.gempty()) {
+ if (!M.global_empty()) {
Out << "\n\n/* Global Variable Definitions and Initialization */\n";
- for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
+ for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I)
if (!I->isExternal()) {
if (I->hasInternalLinkage())
Out << "static ";
/// type name is found, emit it's declaration...
///
void CWriter::printModuleTypes(const SymbolTable &ST) {
- // If there are no type names, exit early.
- if ( ! ST.hasTypes() )
- return;
-
- // We are only interested in the type plane of the symbol table...
+ // We are only interested in the type plane of the symbol table.
SymbolTable::type_const_iterator I = ST.type_begin();
SymbolTable::type_const_iterator End = ST.type_end();
+
+ // If there are no type names, exit early.
+ if (I == End) return;
// Print out forward declarations for structure types before anything else!
Out << "/* Structure forward decls */\n";
FunctionInnards << Mang->getValueName(F) << '(';
if (!F->isExternal()) {
- if (!F->aempty()) {
+ if (!F->arg_empty()) {
std::string ArgName;
- if (F->abegin()->hasName() || !Prototype)
- ArgName = Mang->getValueName(F->abegin());
- printType(FunctionInnards, F->afront().getType(), ArgName);
- for (Function::const_aiterator I = ++F->abegin(), E = F->aend();
+ if (F->arg_begin()->hasName() || !Prototype)
+ ArgName = Mang->getValueName(F->arg_begin());
+ printType(FunctionInnards, F->arg_begin()->getType(), ArgName);
+ for (Function::const_arg_iterator I = ++F->arg_begin(), E = F->arg_end();
I != E; ++I) {
FunctionInnards << ", ";
if (I->hasName() || !Prototype)
BasicBlock *Succ = cast<BasicBlock>(SI.getOperand(i+1));
printPHICopiesForSuccessor (SI.getParent(), Succ, 2);
printBranchToBlock(SI.getParent(), Succ, 2);
- if (Succ == SI.getParent()->getNext())
+ if (Function::iterator(Succ) == next(Function::iterator(SI.getParent())))
Out << " break;\n";
}
Out << " }\n";
/// FIXME: This should be reenabled, but loop reordering safe!!
return true;
- if (From->getNext() != To) // Not the direct successor, we need a goto
- return true;
+ if (next(Function::iterator(From)) != Function::iterator(To))
+ return true; // Not the direct successor, we need a goto.
//isa<SwitchInst>(From->getTerminator())
-
if (LI->getLoopFor(From) != LI->getLoopFor(To))
return true;
return false;
printType(Out, I.getType());
Out << ")(";
}
-
- writeOperand(I.getOperand(0));
- switch (I.getOpcode()) {
- case Instruction::Add: Out << " + "; break;
- case Instruction::Sub: Out << " - "; break;
- case Instruction::Mul: Out << '*'; break;
- case Instruction::Div: Out << '/'; break;
- case Instruction::Rem: Out << '%'; break;
- case Instruction::And: Out << " & "; break;
- case Instruction::Or: Out << " | "; break;
- case Instruction::Xor: Out << " ^ "; break;
- case Instruction::SetEQ: Out << " == "; break;
- case Instruction::SetNE: Out << " != "; break;
- case Instruction::SetLE: Out << " <= "; break;
- case Instruction::SetGE: Out << " >= "; break;
- case Instruction::SetLT: Out << " < "; break;
- case Instruction::SetGT: Out << " > "; break;
- case Instruction::Shl : Out << " << "; break;
- case Instruction::Shr : Out << " >> "; break;
- default: std::cerr << "Invalid operator type!" << I; abort();
- }
+ // If this is a negation operation, print it out as such. For FP, we don't
+ // want to print "-0.0 - X".
+ if (BinaryOperator::isNeg(&I)) {
+ Out << "-";
+ writeOperand(BinaryOperator::getNegArgument(cast<BinaryOperator>(&I)));
+
+ } else {
+ writeOperand(I.getOperand(0));
- writeOperand(I.getOperand(1));
+ switch (I.getOpcode()) {
+ case Instruction::Add: Out << " + "; break;
+ case Instruction::Sub: Out << " - "; break;
+ case Instruction::Mul: Out << '*'; break;
+ case Instruction::Div: Out << '/'; break;
+ case Instruction::Rem: Out << '%'; break;
+ case Instruction::And: Out << " & "; break;
+ case Instruction::Or: Out << " | "; break;
+ case Instruction::Xor: Out << " ^ "; break;
+ case Instruction::SetEQ: Out << " == "; break;
+ case Instruction::SetNE: Out << " != "; break;
+ case Instruction::SetLE: Out << " <= "; break;
+ case Instruction::SetGE: Out << " >= "; break;
+ case Instruction::SetLT: Out << " < "; break;
+ case Instruction::SetGT: Out << " > "; break;
+ case Instruction::Shl : Out << " << "; break;
+ case Instruction::Shr : Out << " >> "; break;
+ default: std::cerr << "Invalid operator type!" << I; abort();
+ }
+
+ writeOperand(I.getOperand(1));
+ }
if (needsCast) {
Out << "))";
break;
default:
// All other intrinsic calls we must lower.
- Instruction *Before = CI->getPrev();
+ Instruction *Before = 0;
+ if (CI != &BB->front())
+ Before = prior(BasicBlock::iterator(CI));
+
IL.LowerIntrinsicCall(CI);
if (Before) { // Move iterator to instruction after call
I = Before; ++I;
Out << "va_start(*(va_list*)&" << Mang->getValueName(&I) << ", ";
// Output the last argument to the enclosing function...
- if (I.getParent()->getParent()->aempty()) {
+ if (I.getParent()->getParent()->arg_empty()) {
std::cerr << "The C backend does not currently support zero "
<< "argument varargs functions, such as '"
<< I.getParent()->getParent()->getName() << "'!\n";
abort();
}
- writeOperand(&I.getParent()->getParent()->aback());
+ writeOperand(--I.getParent()->getParent()->arg_end());
Out << ')';
return;
case Intrinsic::vaend:
writeOperand(I.getOperand(0));
if (I.isVolatile())
- Out << ")";
+ Out << ')';
}
void CWriter::visitStoreInst(StoreInst &I) {
Out << " volatile*)";
}
writeOperand(I.getPointerOperand());
- if (I.isVolatile()) Out << ")";
+ if (I.isVolatile()) Out << ')';
Out << " = ";
writeOperand(I.getOperand(0));
}