diff options
author | Chris Lattner <sabre@nondot.org> | 2002-05-09 15:18:52 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-05-09 15:18:52 +0000 |
commit | deed7a5ae33c4fe04fb312f44cb7c6cbc8ec0cf8 (patch) | |
tree | 34845ef69b494c2b58d4403985d32c53b044714d /lib/Target | |
parent | 3ef6dc7bdd4bb36fb9f24a03c5a7400ebaab21ce (diff) | |
download | external_llvm-deed7a5ae33c4fe04fb312f44cb7c6cbc8ec0cf8.zip external_llvm-deed7a5ae33c4fe04fb312f44cb7c6cbc8ec0cf8.tar.gz external_llvm-deed7a5ae33c4fe04fb312f44cb7c6cbc8ec0cf8.tar.bz2 |
* Continue cleanup of type printing code
* Print a newline after a malloc instruction
* Convert unprintable characters to x_ instead of _x so that we don't
generate identifiers that start with underscores
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2577 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/CBackend/CBackend.cpp | 103 | ||||
-rw-r--r-- | lib/Target/CBackend/Writer.cpp | 103 |
2 files changed, 90 insertions, 116 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index d22a364..c8a06a3 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -158,33 +158,27 @@ static std::string getConstStrValue(const Constant* CPV) { } } -// Internal function // Pass the Type* variable and and the variable name and this prints out the // variable declaration. -// This is different from calcTypeName because if you need to declare an array -// the size of the array would appear after the variable name itself -// For eg. int a[10]; +// static string calcTypeNameVar(const Type *Ty, map<const Type *, string> &TypeNames, const string &NameSoFar, bool ignoreName = false){ if (Ty->isPrimitiveType()) switch (Ty->getPrimitiveID()) { - case Type::BoolTyID: - return "bool " + NameSoFar; - case Type::UByteTyID: - return "unsigned char " + NameSoFar; - case Type::SByteTyID: - return "signed char " + NameSoFar; - case Type::UShortTyID: - return "unsigned long long " + NameSoFar; - case Type::ULongTyID: - return "unsigned long long " + NameSoFar; - case Type::LongTyID: - return "signed long long " + NameSoFar; - case Type::UIntTyID: - return "unsigned " + NameSoFar; + case Type::VoidTyID: return "void " + NameSoFar; + case Type::BoolTyID: return "bool " + NameSoFar; + case Type::UByteTyID: return "unsigned char " + NameSoFar; + case Type::SByteTyID: return "signed char " + NameSoFar; + case Type::UShortTyID: return "unsigned short " + NameSoFar; + case Type::ShortTyID: return "short " + NameSoFar; + case Type::UIntTyID: return "unsigned " + NameSoFar; + case Type::IntTyID: return "int " + NameSoFar; + case Type::ULongTyID: return "unsigned long long " + NameSoFar; + case Type::LongTyID: return "signed long long " + NameSoFar; default : - return Ty->getDescription() + " " + NameSoFar; + cerr << "Unknown primitive type: " << Ty << "\n"; + abort(); } // Check to see if the type is named. @@ -233,14 +227,14 @@ static string calcTypeNameVar(const Type *Ty, case Type::PointerTyID: { Result = calcTypeNameVar(cast<const PointerType>(Ty)->getElementType(), - TypeNames, "(*" + NameSoFar + ")"); + TypeNames, "*" + NameSoFar); break; } case Type::ArrayTyID: { const ArrayType *ATy = cast<const ArrayType>(Ty); int NumElements = ATy->getNumElements(); - Result = calcTypeNameVar(ATy->getElementType(), TypeNames, + Result = calcTypeNameVar(ATy->getElementType(), TypeNames, NameSoFar + "[" + itostr(NumElements) + "]"); break; } @@ -283,7 +277,6 @@ namespace { void printGlobal(const GlobalVariable *GV); void printFunctionSignature(const Function *F); void printFunctionDecl(const Function *F); // Print just the forward decl - void printFunctionArgument(const Argument *FA); void printFunction(const Function *); @@ -471,24 +464,24 @@ void CInstPrintVisitor::visitInvokeInst(InvokeInst *I) { void CInstPrintVisitor::visitMallocInst(MallocInst *I) { outputLValue(I); Out << "("; + CW.printType(I->getType()); + Out << ")malloc(sizeof("; CW.printType(I->getType()->getElementType()); - Out << "*)malloc(sizeof("; - CW.printTypeVar(I->getType()->getElementType(), ""); Out << ")"; if (I->isArrayAllocation()) { Out << " * " ; CW.writeOperand(I->getOperand(0)); } - Out << ");"; + Out << ");\n"; } void CInstPrintVisitor::visitAllocaInst(AllocaInst *I) { outputLValue(I); Out << "("; - CW.printTypeVar(I->getType(), ""); + CW.printType(I->getType()); Out << ") alloca(sizeof("; - CW.printTypeVar(I->getType()->getElementType(), ""); + CW.printType(I->getType()->getElementType()); Out << ")"; if (I->isArrayAllocation()) { Out << " * " ; @@ -590,9 +583,9 @@ static string makeNameProper(string x) { string tmp; for (string::iterator sI = x.begin(), sEnd = x.end(); sI != sEnd; sI++) switch (*sI) { - case '.': tmp += "_d"; break; - case ' ': tmp += "_s"; break; - case '-': tmp += "_D"; break; + case '.': tmp += "d_"; break; + case ' ': tmp += "s_"; break; + case '-': tmp += "D_"; break; case '_': tmp += "__"; break; default: tmp += *sI; } @@ -633,8 +626,17 @@ void CWriter::printModule(const Module *M) { printSymbolTable(*M->getSymbolTable()); Out << "\n\n/* Global Data */\n"; - for_each(M->gbegin(), M->gend(), - bind_obj(this, &CWriter::printGlobal)); + for (Module::const_giterator I = M->gbegin(), E = M->gend(); I != E; ++I) { + GlobalVariable *GV = *I; + if (GV->hasInternalLinkage()) Out << "static "; + printTypeVar(GV->getType()->getElementType(), getValueName(GV)); + + if (GV->hasInitializer()) { + Out << " = " ; + writeOperand(GV->getInitializer()); + } + Out << ";\n"; + } // First output all the declarations of the functions as C requires Functions // be declared before they are used. @@ -647,19 +649,6 @@ void CWriter::printModule(const Module *M) { for_each(M->begin(), M->end(), bind_obj(this, &CWriter::printFunction)); } -// prints the global constants -void CWriter::printGlobal(const GlobalVariable *GV) { - if (GV->hasInternalLinkage()) Out << "static "; - - printTypeVar(GV->getType()->getElementType(), getValueName(GV)); - - if (GV->hasInitializer()) { - Out << " = " ; - writeOperand(GV->getInitializer()); - } - - Out << ";\n"; -} // printSymbolTable - Run through symbol table looking for named constants // if a named constant is found, emit it's declaration... @@ -715,8 +704,17 @@ void CWriter::printFunctionSignature(const Function *F) { Out << " " << getValueName(F) << "("; if (!F->isExternal()) { - for_each(F->getArgumentList().begin(), F->getArgumentList().end(), - bind_obj(this, &CWriter::printFunctionArgument)); + if (!F->getArgumentList().empty()) { + printTypeVar(F->getArgumentList().front()->getType(), + getValueName(F->getArgumentList().front())); + + for (Function::ArgumentListType::const_iterator + I = F->getArgumentList().begin()+1, + E = F->getArgumentList().end(); I != E; ++I) { + Out << ", "; + printTypeVar((*I)->getType(), getValueName(*I)); + } + } } else { // Loop over the arguments, printing them... for (FunctionType::ParamTypes::const_iterator I = @@ -736,17 +734,6 @@ void CWriter::printFunctionSignature(const Function *F) { } -// printFunctionArgument - This member is called for every argument that -// is passed into the method. Simply print it out -// -void CWriter::printFunctionArgument(const Argument *Arg) { - // Insert commas as we go... the first arg doesn't get a comma - if (Arg != Arg->getParent()->getArgumentList().front()) Out << ", "; - - // Output type... - printTypeVar(Arg->getType(), getValueName(Arg)); -} - void CWriter::printFunction(const Function *F) { if (F->isExternal()) return; diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index d22a364..c8a06a3 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -158,33 +158,27 @@ static std::string getConstStrValue(const Constant* CPV) { } } -// Internal function // Pass the Type* variable and and the variable name and this prints out the // variable declaration. -// This is different from calcTypeName because if you need to declare an array -// the size of the array would appear after the variable name itself -// For eg. int a[10]; +// static string calcTypeNameVar(const Type *Ty, map<const Type *, string> &TypeNames, const string &NameSoFar, bool ignoreName = false){ if (Ty->isPrimitiveType()) switch (Ty->getPrimitiveID()) { - case Type::BoolTyID: - return "bool " + NameSoFar; - case Type::UByteTyID: - return "unsigned char " + NameSoFar; - case Type::SByteTyID: - return "signed char " + NameSoFar; - case Type::UShortTyID: - return "unsigned long long " + NameSoFar; - case Type::ULongTyID: - return "unsigned long long " + NameSoFar; - case Type::LongTyID: - return "signed long long " + NameSoFar; - case Type::UIntTyID: - return "unsigned " + NameSoFar; + case Type::VoidTyID: return "void " + NameSoFar; + case Type::BoolTyID: return "bool " + NameSoFar; + case Type::UByteTyID: return "unsigned char " + NameSoFar; + case Type::SByteTyID: return "signed char " + NameSoFar; + case Type::UShortTyID: return "unsigned short " + NameSoFar; + case Type::ShortTyID: return "short " + NameSoFar; + case Type::UIntTyID: return "unsigned " + NameSoFar; + case Type::IntTyID: return "int " + NameSoFar; + case Type::ULongTyID: return "unsigned long long " + NameSoFar; + case Type::LongTyID: return "signed long long " + NameSoFar; default : - return Ty->getDescription() + " " + NameSoFar; + cerr << "Unknown primitive type: " << Ty << "\n"; + abort(); } // Check to see if the type is named. @@ -233,14 +227,14 @@ static string calcTypeNameVar(const Type *Ty, case Type::PointerTyID: { Result = calcTypeNameVar(cast<const PointerType>(Ty)->getElementType(), - TypeNames, "(*" + NameSoFar + ")"); + TypeNames, "*" + NameSoFar); break; } case Type::ArrayTyID: { const ArrayType *ATy = cast<const ArrayType>(Ty); int NumElements = ATy->getNumElements(); - Result = calcTypeNameVar(ATy->getElementType(), TypeNames, + Result = calcTypeNameVar(ATy->getElementType(), TypeNames, NameSoFar + "[" + itostr(NumElements) + "]"); break; } @@ -283,7 +277,6 @@ namespace { void printGlobal(const GlobalVariable *GV); void printFunctionSignature(const Function *F); void printFunctionDecl(const Function *F); // Print just the forward decl - void printFunctionArgument(const Argument *FA); void printFunction(const Function *); @@ -471,24 +464,24 @@ void CInstPrintVisitor::visitInvokeInst(InvokeInst *I) { void CInstPrintVisitor::visitMallocInst(MallocInst *I) { outputLValue(I); Out << "("; + CW.printType(I->getType()); + Out << ")malloc(sizeof("; CW.printType(I->getType()->getElementType()); - Out << "*)malloc(sizeof("; - CW.printTypeVar(I->getType()->getElementType(), ""); Out << ")"; if (I->isArrayAllocation()) { Out << " * " ; CW.writeOperand(I->getOperand(0)); } - Out << ");"; + Out << ");\n"; } void CInstPrintVisitor::visitAllocaInst(AllocaInst *I) { outputLValue(I); Out << "("; - CW.printTypeVar(I->getType(), ""); + CW.printType(I->getType()); Out << ") alloca(sizeof("; - CW.printTypeVar(I->getType()->getElementType(), ""); + CW.printType(I->getType()->getElementType()); Out << ")"; if (I->isArrayAllocation()) { Out << " * " ; @@ -590,9 +583,9 @@ static string makeNameProper(string x) { string tmp; for (string::iterator sI = x.begin(), sEnd = x.end(); sI != sEnd; sI++) switch (*sI) { - case '.': tmp += "_d"; break; - case ' ': tmp += "_s"; break; - case '-': tmp += "_D"; break; + case '.': tmp += "d_"; break; + case ' ': tmp += "s_"; break; + case '-': tmp += "D_"; break; case '_': tmp += "__"; break; default: tmp += *sI; } @@ -633,8 +626,17 @@ void CWriter::printModule(const Module *M) { printSymbolTable(*M->getSymbolTable()); Out << "\n\n/* Global Data */\n"; - for_each(M->gbegin(), M->gend(), - bind_obj(this, &CWriter::printGlobal)); + for (Module::const_giterator I = M->gbegin(), E = M->gend(); I != E; ++I) { + GlobalVariable *GV = *I; + if (GV->hasInternalLinkage()) Out << "static "; + printTypeVar(GV->getType()->getElementType(), getValueName(GV)); + + if (GV->hasInitializer()) { + Out << " = " ; + writeOperand(GV->getInitializer()); + } + Out << ";\n"; + } // First output all the declarations of the functions as C requires Functions // be declared before they are used. @@ -647,19 +649,6 @@ void CWriter::printModule(const Module *M) { for_each(M->begin(), M->end(), bind_obj(this, &CWriter::printFunction)); } -// prints the global constants -void CWriter::printGlobal(const GlobalVariable *GV) { - if (GV->hasInternalLinkage()) Out << "static "; - - printTypeVar(GV->getType()->getElementType(), getValueName(GV)); - - if (GV->hasInitializer()) { - Out << " = " ; - writeOperand(GV->getInitializer()); - } - - Out << ";\n"; -} // printSymbolTable - Run through symbol table looking for named constants // if a named constant is found, emit it's declaration... @@ -715,8 +704,17 @@ void CWriter::printFunctionSignature(const Function *F) { Out << " " << getValueName(F) << "("; if (!F->isExternal()) { - for_each(F->getArgumentList().begin(), F->getArgumentList().end(), - bind_obj(this, &CWriter::printFunctionArgument)); + if (!F->getArgumentList().empty()) { + printTypeVar(F->getArgumentList().front()->getType(), + getValueName(F->getArgumentList().front())); + + for (Function::ArgumentListType::const_iterator + I = F->getArgumentList().begin()+1, + E = F->getArgumentList().end(); I != E; ++I) { + Out << ", "; + printTypeVar((*I)->getType(), getValueName(*I)); + } + } } else { // Loop over the arguments, printing them... for (FunctionType::ParamTypes::const_iterator I = @@ -736,17 +734,6 @@ void CWriter::printFunctionSignature(const Function *F) { } -// printFunctionArgument - This member is called for every argument that -// is passed into the method. Simply print it out -// -void CWriter::printFunctionArgument(const Argument *Arg) { - // Insert commas as we go... the first arg doesn't get a comma - if (Arg != Arg->getParent()->getArgumentList().front()) Out << ", "; - - // Output type... - printTypeVar(Arg->getType(), getValueName(Arg)); -} - void CWriter::printFunction(const Function *F) { if (F->isExternal()) return; |