diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-03-10 23:42:28 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-03-10 23:42:28 +0000 |
commit | 56cc9904803154c0779c78d47595f232e73c45af (patch) | |
tree | d7f9fa800053a39c07a4347c5f9157e6668f9486 /llvm/lib/IR/Module.cpp | |
parent | 2528631f123e15d19b061ae80429c3949d0cc056 (diff) | |
download | llvm-56cc9904803154c0779c78d47595f232e73c45af.zip llvm-56cc9904803154c0779c78d47595f232e73c45af.tar.gz llvm-56cc9904803154c0779c78d47595f232e73c45af.tar.bz2 |
Module: Don't rename in getOrInsertFunction()
During LTO, user-supplied definitions of C library functions often
exist. -instcombine uses Module::getOrInsertFunction() to get a handle
on library functions (e.g., @puts, when optimizing @printf).
Previously, Module::getOrInsertFunction() would rename any matching
functions with local linkage, and create a new declaration. In LTO,
this is the opposite of desired behaviour, as it skips by the
user-supplied version of the library function and creates a new
undefined reference which the linker often cannot resolve.
After some discussing with Rafael on the list, it looks like it's
undesired behaviour. If a consumer actually *needs* this behaviour, we
should add new API with a more explicit name.
I added two testcases: one specifically for the -instcombine behaviour
and one for the LTO flow.
<rdar://problem/16165191>
llvm-svn: 203513
Diffstat (limited to 'llvm/lib/IR/Module.cpp')
-rw-r--r-- | llvm/lib/IR/Module.cpp | 10 |
1 files changed, 0 insertions, 10 deletions
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index c8c07f2..1accd47 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -104,16 +104,6 @@ Constant *Module::getOrInsertFunction(StringRef Name, return New; // Return the new prototype. } - // Okay, the function exists. Does it have externally visible linkage? - if (F->hasLocalLinkage()) { - // Clear the function's name. - F->setName(""); - // Retry, now there won't be a conflict. - Constant *NewF = getOrInsertFunction(Name, Ty); - F->setName(Name); - return NewF; - } - // If the function exists but has the wrong type, return a bitcast to the // right type. if (F->getType() != PointerType::getUnqual(Ty)) |