-//===-- llvm/Analysis/SlotCalculator.h - Calculate value slots ---*- C++ -*-==//
+//===-- llvm/SlotCalculator.h - Calculate value slots ------------*- C++ -*-==//
//
-// This ModuleAnalyzer subclass calculates the slots that values will land in.
-// This is useful for when writing bytecode or assembly out, because you have
-// to know these things.
+// This class calculates the slots that values will land in. This is useful for
+// when writing bytecode or assembly out, because you have to know these things.
+//
+// Specifically, this class calculates the "type plane numbering" that you see
+// for a function if you strip out all of the symbols in it. For assembly
+// writing, this is used when a symbol does not have a name. For bytecode
+// writing, this is always used, and the symbol table is added on later.
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_ANALYSIS_SLOTCALCULATOR_H
-#define LLVM_ANALYSIS_SLOTCALCULATOR_H
+#ifndef LLVM_SLOTCALCULATOR_H
+#define LLVM_SLOTCALCULATOR_H
#include "llvm/SymTabValue.h"
#include <vector>
std::map<const Value *, unsigned> NodeMap;
// ModuleLevel - Used to keep track of which values belong to the module,
- // and which values belong to the currently incorporated method.
+ // and which values belong to the currently incorporated function.
//
std::vector<unsigned> ModuleLevel;
return Table[Plane];
}
- // If you'd like to deal with a method, use these two methods to get its data
- // into the SlotCalculator!
+ // If you'd like to deal with a function, use these two methods to get its
+ // data into the SlotCalculator!
//
- void incorporateMethod(const Function *F);
- void purgeMethod();
+ void incorporateFunction(const Function *F);
+ void purgeFunction();
protected:
// insertVal - Insert a value into the value table... Return the slot that it
// doInsertVal - Small helper function to be called only be insertVal.
int doInsertVal(const Value *D);
- // processModule - Process all of the module level method declarations and
+ // processModule - Process all of the module level function declarations and
// types that are available.
//
void processModule();
-//===-- llvm/Analysis/SlotCalculator.h - Calculate value slots ---*- C++ -*-==//
+//===-- llvm/SlotCalculator.h - Calculate value slots ------------*- C++ -*-==//
//
-// This ModuleAnalyzer subclass calculates the slots that values will land in.
-// This is useful for when writing bytecode or assembly out, because you have
-// to know these things.
+// This class calculates the slots that values will land in. This is useful for
+// when writing bytecode or assembly out, because you have to know these things.
+//
+// Specifically, this class calculates the "type plane numbering" that you see
+// for a function if you strip out all of the symbols in it. For assembly
+// writing, this is used when a symbol does not have a name. For bytecode
+// writing, this is always used, and the symbol table is added on later.
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_ANALYSIS_SLOTCALCULATOR_H
-#define LLVM_ANALYSIS_SLOTCALCULATOR_H
+#ifndef LLVM_SLOTCALCULATOR_H
+#define LLVM_SLOTCALCULATOR_H
#include "llvm/SymTabValue.h"
#include <vector>
std::map<const Value *, unsigned> NodeMap;
// ModuleLevel - Used to keep track of which values belong to the module,
- // and which values belong to the currently incorporated method.
+ // and which values belong to the currently incorporated function.
//
std::vector<unsigned> ModuleLevel;
return Table[Plane];
}
- // If you'd like to deal with a method, use these two methods to get its data
- // into the SlotCalculator!
+ // If you'd like to deal with a function, use these two methods to get its
+ // data into the SlotCalculator!
//
- void incorporateMethod(const Function *F);
- void purgeMethod();
+ void incorporateFunction(const Function *F);
+ void purgeFunction();
protected:
// insertVal - Insert a value into the value table... Return the slot that it
// doInsertVal - Small helper function to be called only be insertVal.
int doInsertVal(const Value *D);
- // processModule - Process all of the module level method declarations and
+ // processModule - Process all of the module level function declarations and
// types that are available.
//
void processModule();
//
//===----------------------------------------------------------------------===//
-#include "llvm/Analysis/SlotCalculator.h"
+#include "llvm/SlotCalculator.h"
#include "llvm/Analysis/ConstantsScanner.h"
#include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
if (TheModule == 0) return; // Empty table...
processModule(); // Process module level stuff
- incorporateMethod(M); // Start out in incorporated state
+ incorporateFunction(M); // Start out in incorporated state
}
}
-void SlotCalculator::incorporateMethod(const Function *M) {
+void SlotCalculator::incorporateFunction(const Function *M) {
assert(ModuleLevel.size() == 0 && "Module already incorporated!");
SC_DEBUG("begin processFunction!\n");
SC_DEBUG("end processFunction!\n");
}
-void SlotCalculator::purgeMethod() {
+void SlotCalculator::purgeFunction() {
assert(ModuleLevel.size() != 0 && "Module not incorporated!");
unsigned NumModuleTypes = ModuleLevel.size();
-//===-- llvm/Analysis/SlotCalculator.h - Calculate value slots ---*- C++ -*-==//
+//===-- llvm/SlotCalculator.h - Calculate value slots ------------*- C++ -*-==//
//
-// This ModuleAnalyzer subclass calculates the slots that values will land in.
-// This is useful for when writing bytecode or assembly out, because you have
-// to know these things.
+// This class calculates the slots that values will land in. This is useful for
+// when writing bytecode or assembly out, because you have to know these things.
+//
+// Specifically, this class calculates the "type plane numbering" that you see
+// for a function if you strip out all of the symbols in it. For assembly
+// writing, this is used when a symbol does not have a name. For bytecode
+// writing, this is always used, and the symbol table is added on later.
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_ANALYSIS_SLOTCALCULATOR_H
-#define LLVM_ANALYSIS_SLOTCALCULATOR_H
+#ifndef LLVM_SLOTCALCULATOR_H
+#define LLVM_SLOTCALCULATOR_H
#include "llvm/SymTabValue.h"
#include <vector>
std::map<const Value *, unsigned> NodeMap;
// ModuleLevel - Used to keep track of which values belong to the module,
- // and which values belong to the currently incorporated method.
+ // and which values belong to the currently incorporated function.
//
std::vector<unsigned> ModuleLevel;
return Table[Plane];
}
- // If you'd like to deal with a method, use these two methods to get its data
- // into the SlotCalculator!
+ // If you'd like to deal with a function, use these two methods to get its
+ // data into the SlotCalculator!
//
- void incorporateMethod(const Function *F);
- void purgeMethod();
+ void incorporateFunction(const Function *F);
+ void purgeFunction();
protected:
// insertVal - Insert a value into the value table... Return the slot that it
// doInsertVal - Small helper function to be called only be insertVal.
int doInsertVal(const Value *D);
- // processModule - Process all of the module level method declarations and
+ // processModule - Process all of the module level function declarations and
// types that are available.
//
void processModule();
//
// This library implements the functionality defined in llvm/Bytecode/Writer.h
//
-// This library uses the Analysis library to figure out offsets for
-// variables in the method tables...
-//
// Note that this file uses an unusual technique of outputting all the bytecode
// to a deque of unsigned char's, then copies the deque to an ostream. The
// reason for this is that we must do "seeking" in the stream to do back-
output_vbr((unsigned)Type::FirstDerivedTyID, Out);
align32(Out);
- // Output module level constants, including types used by the method protos
+ // Output module level constants, including types used by the function protos
outputConstants(false);
// The ModuleInfoBlock follows directly after the Module constant pool
outputModuleInfoBlock(M);
- // Do the whole module now! Process each method at a time...
+ // Do the whole module now! Process each function at a time...
for_each(M->begin(), M->end(),
bind_obj(this, &BytecodeWriter::processMethod));
else if (pno == Type::TypeTyID)
ValNo = Type::FirstDerivedTyID; // Start emitting at the derived types...
- // Scan through and ignore method arguments...
+ // Scan through and ignore function arguments...
for (; ValNo < Plane.size() && isa<FunctionArgument>(Plane[ValNo]); ValNo++)
/*empty*/;
// Output the Type ID Number...
int Slot = Table.getValSlot(Plane.front()->getType());
- assert (Slot != -1 && "Type in constant pool but not in method!!");
+ assert (Slot != -1 && "Type in constant pool but not in function!!");
output_vbr((unsigned)Slot, Out);
//cerr << "Emitting " << NC << " constants of type '"
}
output_vbr((unsigned)Table.getValSlot(Type::VoidTy), Out);
- // Output the types of the methods in this module...
+ // Output the types of the functions in this module...
for (Module::const_iterator I = M->begin(), End = M->end(); I != End; ++I) {
int Slot = Table.getValSlot((*I)->getType());
assert(Slot != -1 && "Module const pool is broken!");
// Only output the constant pool and other goodies if needed...
if (!M->isExternal()) {
- // Get slot information about the method...
- Table.incorporateMethod(M);
+ // Get slot information about the function...
+ Table.incorporateFunction(M);
- // Output information about the constants in the method...
+ // Output information about the constants in the function...
outputConstants(true);
// Output basic block nodes...
for_each(M->begin(), M->end(),
bind_obj(this, &BytecodeWriter::processBasicBlock));
- // If needed, output the symbol table for the method...
+ // If needed, output the symbol table for the function...
if (M->hasSymbolTable())
outputSymbolTable(*M->getSymbolTable());
- Table.purgeMethod();
+ Table.purgeFunction();
}
}
#include "llvm/Bytecode/Writer.h"
#include "llvm/Bytecode/Format.h"
-#include "llvm/Analysis/SlotCalculator.h"
#include "llvm/Bytecode/Primitives.h"
+#include "llvm/SlotCalculator.h"
#include "llvm/Instruction.h"
#include <deque>
//===----------------------------------------------------------------------===//
#include "SparcInternals.h"
-#include "llvm/Analysis/SlotCalculator.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineCodeForMethod.h"
#include "llvm/GlobalVariable.h"
#include "llvm/BasicBlock.h"
#include "llvm/Function.h"
#include "llvm/Module.h"
+#include "llvm/SlotCalculator.h"
#include "Support/StringExtras.h"
#include "Support/HashExtras.h"
#include <iostream>
}
}
void startFunction(Function *F) {
- // Make sure the slot table has information about this method...
- idTable->Table->incorporateMethod(F);
+ // Make sure the slot table has information about this function...
+ idTable->Table->incorporateFunction(F);
}
void endFunction(Function *F) {
- idTable->Table->purgeMethod(); // Forget all about F
+ idTable->Table->purgeFunction(); // Forget all about F
}
void endModule() {
}
//===----------------------------------------------------------------------===//
#include "llvm/Assembly/CachedWriter.h"
-#include "llvm/Analysis/SlotCalculator.h"
+#include "llvm/SlotCalculator.h"
#include "llvm/Module.h"
#include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
Out << "implementation\n";
- // Output all of the methods...
+ // Output all of the functions...
for_each(M->begin(), M->end(), bind_obj(this,&AssemblyWriter::printFunction));
}
Out << "\n";
}
-// printFunction - Print all aspects of a method.
+// printFunction - Print all aspects of a function.
//
void AssemblyWriter::printFunction(const Function *M) {
// Print out the return type and name...
Out << "\n" << (M->isExternal() ? "declare " : "")
<< (M->hasInternalLinkage() ? "internal " : "");
printType(M->getReturnType()) << " \"" << M->getName() << "\"(";
- Table.incorporateMethod(M);
+ Table.incorporateFunction(M);
// Loop over the arguments, printing them...
const FunctionType *MT = M->getFunctionType();
Out << "begin";
- // Output all of its basic blocks... for the method
+ // Output all of its basic blocks... for the function
for_each(M->begin(), M->end(),
bind_obj(this, &AssemblyWriter::printBasicBlock));
Out << "end\n";
}
- Table.purgeMethod();
+ Table.purgeFunction();
}
// printFunctionArgument - This member is called for every argument that
-// is passed into the method. Simply print it out
+// is passed into the function. Simply print it out
//
void AssemblyWriter::printFunctionArgument(const FunctionArgument *Arg) {
// Insert commas as we go... the first arg doesn't get a comma
const Type *RetTy = MTy ? MTy->getReturnType() : 0;
// If possible, print out the short form of the call instruction, but we can
- // only do this if the first argument is a pointer to a nonvararg method,
- // and if the value returned is not a pointer to a method.
+ // only do this if the first argument is a pointer to a nonvararg function,
+ // and if the value returned is not a pointer to a function.
//
if (RetTy && !MTy->isVarArg() &&
(!isa<PointerType>(RetTy)||!isa<FunctionType>(cast<PointerType>(RetTy)))){
#include "llvm/SymbolTable.h"
#include "llvm/GlobalValue.h"
#include "llvm/Module.h"
-#include "llvm/Analysis/SlotCalculator.h"
+#include "llvm/SlotCalculator.h"
#include "Support/StringExtras.h"
#include <algorithm>
const GlobalValue *V = getValue();
if (V->hasName()) return "%" + V->getName();
+ // FIXME: This is a gross hack.
SlotCalculator *Table = new SlotCalculator(V->getParent(), true);
int Slot = Table->getValSlot(V);
delete Table;
//
//===----------------------------------------------------------------------===//
-#include "llvm/Analysis/SlotCalculator.h"
+#include "llvm/SlotCalculator.h"
#include "llvm/Analysis/ConstantsScanner.h"
#include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
if (TheModule == 0) return; // Empty table...
processModule(); // Process module level stuff
- incorporateMethod(M); // Start out in incorporated state
+ incorporateFunction(M); // Start out in incorporated state
}
}
-void SlotCalculator::incorporateMethod(const Function *M) {
+void SlotCalculator::incorporateFunction(const Function *M) {
assert(ModuleLevel.size() == 0 && "Module already incorporated!");
SC_DEBUG("begin processFunction!\n");
SC_DEBUG("end processFunction!\n");
}
-void SlotCalculator::purgeMethod() {
+void SlotCalculator::purgeFunction() {
assert(ModuleLevel.size() != 0 && "Module not incorporated!");
unsigned NumModuleTypes = ModuleLevel.size();