Revise the implementation logic of sized deallocation: Do not automatically generate weak definitions of the sized operator delete (in terms of unsized operator delete). Instead, provide the funcitonality via a new compiler flag, -fdef-sized-delete.

The current implementation causes link-time ODR violations when the delete symbols are exported into the dynamic table.

llvm-svn: 229241
This commit is contained in:
Larisse Voufo
2015-02-14 05:42:57 +00:00
parent 0414b8578e
commit 5526f4f094
8 changed files with 38 additions and 17 deletions

View File

@@ -891,8 +891,11 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
} else if (FunctionDecl *UnsizedDealloc =
FD->getCorrespondingUnsizedGlobalDeallocationFunction()) {
// Global sized deallocation functions get an implicit weak definition if
// they don't have an explicit definition.
// they don't have an explicit definition, if allowed.
assert(getLangOpts().DefaultSizedDelete &&
"Can't emit unallowed definition.");
EmitSizedDeallocationFunction(*this, UnsizedDealloc);
} else
llvm_unreachable("no definition for emitted function");