diff options
| author | Sam Clegg <sbc@chromium.org> | 2019-02-20 22:40:57 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2019-02-20 22:40:57 +0000 |
| commit | 6028c969ac8513791d9998797f29a3ae2086aa20 (patch) | |
| tree | cbb02f67404246942489f03632474714673b5440 /llvm/lib/Target | |
| parent | 65e9f988611fbccea974a91061fce7f4b65dca6d (diff) | |
| download | bcm5719-llvm-6028c969ac8513791d9998797f29a3ae2086aa20.tar.gz bcm5719-llvm-6028c969ac8513791d9998797f29a3ae2086aa20.zip | |
[WebAssembly] Don't error on conflicting uses of prototype-less functions
When we can't determine with certainty the signature of a function
import we pick the fist signature we find rather than error'ing out.
The resulting program might not do what is expected since we might pick
the wrong signature. However since undefined behavior in C to use the
same function with different signatures this seems better than refusing
to compile such programs.
Fixes PR40472
Differential Revision: https://reviews.llvm.org/D58304
llvm-svn: 354523
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp index 97ca0615d77..8604d9e1799 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp @@ -89,22 +89,24 @@ bool WebAssemblyAddMissingPrototypes::runOnModule(Module &M) { Function *NewF = nullptr; for (Use &U : F.uses()) { LLVM_DEBUG(dbgs() << "prototype-less use: " << F.getName() << "\n"); + LLVM_DEBUG(dbgs() << *U.getUser() << "\n"); if (auto *BC = dyn_cast<BitCastOperator>(U.getUser())) { if (auto *DestType = dyn_cast<FunctionType>( BC->getDestTy()->getPointerElementType())) { if (!NewType) { // Create a new function with the correct type NewType = DestType; + LLVM_DEBUG(dbgs() << "found function type: " << *NewType << "\n"); NewF = Function::Create(NewType, F.getLinkage(), F.getName() + ".fixed_sig"); NewF->setAttributes(F.getAttributes()); NewF->removeFnAttr("no-prototype"); Replacements.emplace_back(&F, NewF); - } else { - if (NewType != DestType) { - report_fatal_error("Prototypeless function used with " - "conflicting signatures: " + - F.getName()); - } + } else if (NewType != DestType) { + errs() << "warning: prototype-less function used with " + "conflicting signatures: " + << F.getName() << "\n"; + LLVM_DEBUG(dbgs() << " " << *DestType << "\n"); + LLVM_DEBUG(dbgs() << " "<< *NewType << "\n"); } } } |

