diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 36 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 5 |
2 files changed, 5 insertions, 36 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 9bb12900fa8..92af03ea89d 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -929,18 +929,9 @@ void CodeGenModule::UpdateCompletedType(const TagDecl *TD) { } -/// getBuiltinLibFunction +/// getBuiltinLibFunction - Given a builtin id for a function like +/// "__builtin_fabsf", return a Function* for "fabsf". llvm::Value *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) { - if (BuiltinID > BuiltinFunctions.size()) - BuiltinFunctions.resize(BuiltinID); - - // Cache looked up functions. Since builtin id #0 is invalid we don't reserve - // a slot for it. - assert(BuiltinID && "Invalid Builtin ID"); - llvm::Value *&FunctionSlot = BuiltinFunctions[BuiltinID-1]; - if (FunctionSlot) - return FunctionSlot; - assert((Context.BuiltinInfo.isLibFunction(BuiltinID) || Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) && "isn't a lib fn"); @@ -958,27 +949,10 @@ llvm::Value *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) { const llvm::FunctionType *Ty = cast<llvm::FunctionType>(getTypes().ConvertType(Type)); - // FIXME: This has a serious problem with code like this: - // void abs() {} - // ... __builtin_abs(x); - // The two versions of abs will collide. The fix is for the builtin to win, - // and for the existing one to be turned into a constantexpr cast of the - // builtin. In the case where the existing one is a static function, it - // should just be renamed. - if (llvm::Function *Existing = getModule().getFunction(Name)) { - if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage()) - return FunctionSlot = Existing; - assert(Existing == 0 && "FIXME: Name collision"); - } - - llvm::GlobalValue *&ExistingFn = - GlobalDeclMap[getContext().Idents.get(Name).getName()]; - assert(!ExistingFn && "Asking for the same builtin multiple times?"); - + // Unique the name through the identifier table. + Name = getContext().Idents.get(Name).getName(); // FIXME: param attributes for sext/zext etc. - return FunctionSlot = ExistingFn = - llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name, - &getModule()); + return GetOrCreateLLVMFunction(Name, Ty, 0); } llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys, diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index fdf5775170f..a32774852d5 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -137,11 +137,6 @@ class CodeGenModule : public BlockModule { /// CFConstantStringClassRef - Cached reference to the class for constant /// strings. This value has type int * but is actually an Obj-C class pointer. llvm::Constant *CFConstantStringClassRef; - - /// BuiltinFunctions - This is the cached set of Function*'s that have been - /// created for each builtin, indexed by the Builtin ID. This is null if the - /// Function* has not yet been created. - std::vector<llvm::Value *> BuiltinFunctions; public: CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M, const llvm::TargetData &TD, Diagnostic &Diags, |