Partially inline basic_string copy constructor in UNSTABLE
his change splits the copy constructor up inlining short initialization, and explicitly outlining long initialization into __init_copy_ctor_external() which is the externally instantiated slow path.
For unstable ABI, this has the following changes:
remove basic_string(const basic_string&)
remove basic_string(const basic_string&, const Allocator&)
add __init_copy_ctor_external(const value_type*, size_type)
Quick local benchmark for Copy:
Master
```
---------------------------------------------------------------
Benchmark Time CPU Iterations
---------------------------------------------------------------
BM_StringCopy_Empty 3.50 ns 3.51 ns
199326720
BM_StringCopy_Small 3.50 ns 3.51 ns
199510016
BM_StringCopy_Large 15.7 ns 15.7 ns
45230080
BM_StringCopy_Huge 1503 ns 1503 ns 464896
```
```
---------------------------------------------------------------
Benchmark Time CPU Iterations
---------------------------------------------------------------
BM_StringCopy_Empty 1.99 ns 2.00 ns
356471808
BM_StringCopy_Small 3.29 ns 3.30 ns
203425792
BM_StringCopy_Large 13.3 ns 13.3 ns
52948992
BM_StringCopy_Huge 1472 ns 1472 ns 475136
```
Author: Martijn Vels <martijn.vels@gmail.com>
Reviewers: EricWF, mclow.list
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D73223