cast inst
This commit is contained in:
39
cbackend.cpp
39
cbackend.cpp
@@ -140,11 +140,14 @@ namespace {
|
|||||||
llvm::DenseSet<const llvm::Metadata*> VisitedMDNodes;
|
llvm::DenseSet<const llvm::Metadata*> VisitedMDNodes;
|
||||||
#endif
|
#endif
|
||||||
llvm::DenseSet<llvm::Type*> VisitedTypes;
|
llvm::DenseSet<llvm::Type*> VisitedTypes;
|
||||||
|
|
||||||
std::vector<llvm::ArrayType*> &ArrayTypes;
|
std::vector<llvm::ArrayType*> &ArrayTypes;
|
||||||
|
std::vector<llvm::IntegerType*> &IntegerTypes;
|
||||||
|
std::vector<bool> &IsVolatile;
|
||||||
|
std::vector<int> &Alignment;
|
||||||
public:
|
public:
|
||||||
TypeFinder(std::vector<llvm::ArrayType*> &t)
|
TypeFinder(std::vector<llvm::ArrayType*> &t, std::vector<llvm::IntegerType*> &i,
|
||||||
: ArrayTypes(t) {}
|
std::vector<bool> &v, std::vector<int> &a)
|
||||||
|
: ArrayTypes(t), IntegerTypes(i) , IsVolatile(v), Alignment(a){}
|
||||||
|
|
||||||
void run(const llvm::Module &M) {
|
void run(const llvm::Module &M) {
|
||||||
// Get types from global variables.
|
// Get types from global variables.
|
||||||
@@ -182,6 +185,13 @@ namespace {
|
|||||||
|
|
||||||
// Incorporate the type of the instruction and all its operands.
|
// Incorporate the type of the instruction and all its operands.
|
||||||
incorporateType(I.getType());
|
incorporateType(I.getType());
|
||||||
|
if (llvm::isa<llvm::LoadInst>(&I))
|
||||||
|
if (llvm::IntegerType *ITy = llvm::dyn_cast<llvm::IntegerType>(I.getType())) {
|
||||||
|
IntegerTypes.push_back(ITy);
|
||||||
|
// llvm::StoreInst St = llvm::dyn_cast<llvm::StoreInst>(I);
|
||||||
|
// IsVolatile.push_back(St.isVolatile());
|
||||||
|
// Alignment.push_back(St.getAlignment());
|
||||||
|
}
|
||||||
for (llvm::User::const_op_iterator OI = I.op_begin(), OE = I.op_end();
|
for (llvm::User::const_op_iterator OI = I.op_begin(), OE = I.op_end();
|
||||||
OI != OE; ++OI)
|
OI != OE; ++OI)
|
||||||
incorporateValue(*OI);
|
incorporateValue(*OI);
|
||||||
@@ -288,8 +298,9 @@ namespace {
|
|||||||
};
|
};
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
||||||
static void findUsedArrayTypes(const llvm::Module *m, std::vector<llvm::ArrayType*> &t) {
|
static void findUsedArrayTypes(const llvm::Module *m, std::vector<llvm::ArrayType*> &t, std::vector<llvm::IntegerType*> &i,
|
||||||
TypeFinder(t).run(*m);
|
std::vector<bool> &IsVolatile, std::vector<int> &Alignment) {
|
||||||
|
TypeFinder(t, i, IsVolatile, Alignment).run(*m);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@@ -2741,17 +2752,15 @@ void CWriter::printModuleTypes() {
|
|||||||
|
|
||||||
// Get all of the array types used in the module
|
// Get all of the array types used in the module
|
||||||
std::vector<llvm::ArrayType*> ArrayTypes;
|
std::vector<llvm::ArrayType*> ArrayTypes;
|
||||||
findUsedArrayTypes(TheModule, ArrayTypes);
|
std::vector<llvm::IntegerType*> IntegerTypes;
|
||||||
|
std::vector<bool> IsVolatile;
|
||||||
|
std::vector<int> Alignment;
|
||||||
|
|
||||||
|
findUsedArrayTypes(TheModule, ArrayTypes, IntegerTypes, IsVolatile, Alignment);
|
||||||
|
|
||||||
if (StructTypes.empty() && ArrayTypes.empty())
|
if (StructTypes.empty() && ArrayTypes.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Out << "DEBUG_ME";
|
|
||||||
for (llvm::Module::const_global_iterator I = TheModule->global_begin(), E = TheModule->global_end();
|
|
||||||
I != E; ++I) {
|
|
||||||
Out << I << "^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
Out << "/* Structure and array forward declarations */\n";
|
Out << "/* Structure and array forward declarations */\n";
|
||||||
|
|
||||||
unsigned NextTypeID = 0;
|
unsigned NextTypeID = 0;
|
||||||
@@ -2775,6 +2784,12 @@ void CWriter::printModuleTypes() {
|
|||||||
std::string Name = getArrayName(AT);
|
std::string Name = getArrayName(AT);
|
||||||
Out << "struct " << Name << ";\n";
|
Out << "struct " << Name << ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (unsigned i = 0, e = IntegerTypes.size(); i != e; ++i) {
|
||||||
|
llvm::IntegerType *IT = IntegerTypes[i];
|
||||||
|
Out << "bitwidth: " << IT->getIntegerBitWidth () << "|" << IsVolatile[i] << "|" << Alignment[i] << ";\n";
|
||||||
|
}
|
||||||
|
|
||||||
Out << '\n';
|
Out << '\n';
|
||||||
|
|
||||||
// Keep track of which types have been printed so far.
|
// Keep track of which types have been printed so far.
|
||||||
|
|||||||
Reference in New Issue
Block a user