mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
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:
parent
35c28eca62
commit
0fd38069cb
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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 '{}*'.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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!";
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user