improve the APIs for creating struct and function types with no arguments/elements

to not have to create a temporary vector (in the API at least).  Patch by Jay Foad!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74584 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-07-01 04:13:31 +00:00
parent 35c28eca62
commit 0fd38069cb
11 changed files with 29 additions and 23 deletions

View File

@ -27,8 +27,7 @@ int main() {
Module *M = new Module("test"); Module *M = new Module("test");
// Create the main function: first create the type 'int ()' // Create the main function: first create the type 'int ()'
FunctionType *FT = FunctionType::get(Type::Int32Ty, std::vector<const Type*>(), FunctionType *FT = FunctionType::get(Type::Int32Ty, /*not vararg*/false);
/*not vararg*/false);
// By passing a module as the last parameter to the Function constructor, // By passing a module as the last parameter to the Function constructor,
// it automatically gets appended to the Module. // it automatically gets appended to the Module.

View File

@ -159,6 +159,15 @@ public:
bool isVarArg ///< Whether this is a variable argument length function bool isVarArg ///< Whether this is a variable argument length function
); );
/// FunctionType::get - Create a FunctionType taking no parameters.
///
static FunctionType *get(
const Type *Result, ///< The result type
bool isVarArg ///< Whether this is a variable argument length function
) {
return get(Result, std::vector<const Type *>(), isVarArg);
}
/// isValidReturnType - Return true if the specified type is valid as a return /// isValidReturnType - Return true if the specified type is valid as a return
/// type. /// type.
static bool isValidReturnType(const Type *RetTy); static bool isValidReturnType(const Type *RetTy);
@ -234,6 +243,12 @@ public:
static StructType *get(const std::vector<const Type*> &Params, static StructType *get(const std::vector<const Type*> &Params,
bool isPacked=false); bool isPacked=false);
/// StructType::get - Create an empty structure type.
///
static StructType *get(bool isPacked=false) {
return get(std::vector<const Type*>(), isPacked);
}
/// StructType::get - This static method is a convenience method for /// StructType::get - This static method is a convenience method for
/// creating structure types by specifying the elements as arguments. /// creating structure types by specifying the elements as arguments.
/// Note that this method always returns a non-packed struct. To get /// Note that this method always returns a non-packed struct. To get

View File

@ -253,8 +253,7 @@ public:
private: private:
static const FunctionType *create() { static const FunctionType *create() {
std::vector<const Type*> params; return FunctionType::get(TypeBuilder<R, cross>::get(), false);
return FunctionType::get(TypeBuilder<R, cross>::get(), params, false);
} }
}; };
template<typename R, typename A1, bool cross> class TypeBuilder<R(A1), cross> { template<typename R, typename A1, bool cross> class TypeBuilder<R(A1), cross> {
@ -360,8 +359,7 @@ public:
private: private:
static const FunctionType *create() { static const FunctionType *create() {
std::vector<const Type*> params; return FunctionType::get(TypeBuilder<R, cross>::get(), true);
return FunctionType::get(TypeBuilder<R, cross>::get(), params, true);
} }
}; };
template<typename R, typename A1, bool cross> template<typename R, typename A1, bool cross>

View File

@ -327,7 +327,7 @@ bool DISubprogram::describes(const Function *F) {
DIFactory::DIFactory(Module &m) DIFactory::DIFactory(Module &m)
: M(m), StopPointFn(0), FuncStartFn(0), RegionStartFn(0), RegionEndFn(0), : M(m), StopPointFn(0), FuncStartFn(0), RegionStartFn(0), RegionEndFn(0),
DeclareFn(0) { DeclareFn(0) {
EmptyStructPtr = PointerType::getUnqual(StructType::get(NULL, NULL)); EmptyStructPtr = PointerType::getUnqual(StructType::get());
} }
/// getCastToEmpty - Return this descriptor as a Constant* with type '{}*'. /// getCastToEmpty - Return this descriptor as a Constant* with type '{}*'.

View File

@ -1244,7 +1244,7 @@ bool LLParser::ParseStructType(PATypeHolder &Result, bool Packed) {
Lex.Lex(); // Consume the '{' Lex.Lex(); // Consume the '{'
if (EatIfPresent(lltok::rbrace)) { if (EatIfPresent(lltok::rbrace)) {
Result = StructType::get(std::vector<const Type*>(), Packed); Result = StructType::get(Packed);
return false; return false;
} }

View File

@ -271,8 +271,7 @@ ProgramInfo::getSourceFiles(bool RequiresCompleteMap) {
// should be on the use list of the llvm.dbg.translation_units global. // should be on the use list of the llvm.dbg.translation_units global.
// //
GlobalVariable *Units = GlobalVariable *Units =
M->getGlobalVariable("llvm.dbg.translation_units", M->getGlobalVariable("llvm.dbg.translation_units", StructType::get());
StructType::get(std::vector<const Type*>()));
if (Units == 0) if (Units == 0)
throw "Program contains no debugging information!"; throw "Program contains no debugging information!";
@ -354,8 +353,7 @@ ProgramInfo::getSourceFunctions(bool RequiresCompleteMap) {
// should be on the use list of the llvm.dbg.translation_units global. // should be on the use list of the llvm.dbg.translation_units global.
// //
GlobalVariable *Units = GlobalVariable *Units =
M->getGlobalVariable("llvm.dbg.globals", M->getGlobalVariable("llvm.dbg.globals", StructType::get());
StructType::get(std::vector<const Type*>()));
if (Units == 0) if (Units == 0)
throw "Program contains no debugging information!"; throw "Program contains no debugging information!";

View File

@ -453,7 +453,7 @@ GenericValue JIT::runFunction(Function *F,
// arguments. Make this function and return. // arguments. Make this function and return.
// First, create the function. // First, create the function.
FunctionType *STy=FunctionType::get(RetTy, std::vector<const Type*>(), false); FunctionType *STy=FunctionType::get(RetTy, false);
Function *Stub = Function::Create(STy, Function::InternalLinkage, "", Function *Stub = Function::Create(STy, Function::InternalLinkage, "",
F->getParent()); F->getParent());

View File

@ -1928,8 +1928,7 @@ static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL,
if (Ctors[i]) { if (Ctors[i]) {
CSVals[1] = Ctors[i]; CSVals[1] = Ctors[i];
} else { } else {
const Type *FTy = FunctionType::get(Type::VoidTy, const Type *FTy = FunctionType::get(Type::VoidTy, false);
std::vector<const Type*>(), false);
const PointerType *PFTy = PointerType::getUnqual(FTy); const PointerType *PFTy = PointerType::getUnqual(FTy);
CSVals[1] = Constant::getNullValue(PFTy); CSVals[1] = Constant::getNullValue(PFTy);
CSVals[0] = ConstantInt::get(Type::Int32Ty, 2147483647); CSVals[0] = ConstantInt::get(Type::Int32Ty, 2147483647);

View File

@ -92,8 +92,7 @@ void RaiseAllocations::doInitialization(Module &M) {
// i8*(...) * malloc // i8*(...) * malloc
// This handles the common declaration of: 'void *malloc();' // This handles the common declaration of: 'void *malloc();'
const FunctionType *Malloc3Type = const FunctionType *Malloc3Type =
FunctionType::get(PointerType::getUnqual(Type::Int8Ty), FunctionType::get(PointerType::getUnqual(Type::Int8Ty), true);
std::vector<const Type*>(), true);
if (TyWeHave != Malloc3Type) if (TyWeHave != Malloc3Type)
// Give up // Give up
MallocFunc = 0; MallocFunc = 0;
@ -113,14 +112,12 @@ void RaiseAllocations::doInitialization(Module &M) {
// Check to see if the prototype was forgotten, giving us // Check to see if the prototype was forgotten, giving us
// void (...) * free // void (...) * free
// This handles the common forward declaration of: 'void free();' // This handles the common forward declaration of: 'void free();'
const FunctionType* Free2Type = FunctionType::get(Type::VoidTy, const FunctionType* Free2Type = FunctionType::get(Type::VoidTy, true);
std::vector<const Type*>(),true);
if (TyWeHave != Free2Type) { if (TyWeHave != Free2Type) {
// One last try, check to see if we can find free as // One last try, check to see if we can find free as
// int (...)* free. This handles the case where NOTHING was declared. // int (...)* free. This handles the case where NOTHING was declared.
const FunctionType* Free3Type = FunctionType::get(Type::Int32Ty, const FunctionType* Free3Type = FunctionType::get(Type::Int32Ty, true);
std::vector<const Type*>(),true);
if (TyWeHave != Free3Type) { if (TyWeHave != Free3Type) {
// Give up. // Give up.

View File

@ -89,7 +89,7 @@ bool LowerAllocations::doInitialization(Module &M) {
const Type *BPTy = PointerType::getUnqual(Type::Int8Ty); const Type *BPTy = PointerType::getUnqual(Type::Int8Ty);
// Prototype malloc as "char* malloc(...)", because we don't know in // Prototype malloc as "char* malloc(...)", because we don't know in
// doInitialization whether size_t is int or long. // doInitialization whether size_t is int or long.
FunctionType *FT = FunctionType::get(BPTy, std::vector<const Type*>(), true); FunctionType *FT = FunctionType::get(BPTy, true);
MallocFunc = M.getOrInsertFunction("malloc", FT); MallocFunc = M.getOrInsertFunction("malloc", FT);
FreeFunc = M.getOrInsertFunction("free" , Type::VoidTy, BPTy, (Type *)0); FreeFunc = M.getOrInsertFunction("free" , Type::VoidTy, BPTy, (Type *)0);
return true; return true;

View File

@ -146,7 +146,7 @@ static void EmitTypeForValueType(std::ostream &OS, MVT::SimpleValueType VT) {
OS << "IntegerType::get(" << BitWidth << ")"; OS << "IntegerType::get(" << BitWidth << ")";
} else if (VT == MVT::Other) { } else if (VT == MVT::Other) {
// MVT::OtherVT is used to mean the empty struct type here. // MVT::OtherVT is used to mean the empty struct type here.
OS << "StructType::get(std::vector<const Type *>())"; OS << "StructType::get()";
} else if (VT == MVT::f32) { } else if (VT == MVT::f32) {
OS << "Type::FloatTy"; OS << "Type::FloatTy";
} else if (VT == MVT::f64) { } else if (VT == MVT::f64) {