diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d83835a0f7b8a3..0c821b85c229a5 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3754,7 +3754,12 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D, Args.hasFlag(options::OPT_fsplit_dwarf_inlining, options::OPT_fno_split_dwarf_inlining, false); - if (const Arg *A = Args.getLastArg(options::OPT_g_Group)) { + // Normally -gsplit-dwarf is only useful with -gN. For -gsplit-dwarf in the + // backend phase of a distributed ThinLTO which does object file generation + // and no IR generation, -gN should not be needed. So allow -gsplit-dwarf with + // either -gN or -fthinlto-index=. + if (Args.hasArg(options::OPT_g_Group) || + Args.hasArg(options::OPT_fthinlto_index_EQ)) { Arg *SplitDWARFArg; DwarfFission = getDebugFissionKind(D, Args, SplitDWARFArg); if (DwarfFission != DwarfFissionKind::None && @@ -3762,7 +3767,8 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D, DwarfFission = DwarfFissionKind::None; SplitDWARFInlining = false; } - + } + if (const Arg *A = Args.getLastArg(options::OPT_g_Group)) { DebugInfoKind = codegenoptions::LimitedDebugInfo; // If the last option explicitly specified a debug-info level, use it. diff --git a/clang/test/Driver/split-debug.c b/clang/test/Driver/split-debug.c index de1258dcb13c99..2ce4ca980c3fcf 100644 --- a/clang/test/Driver/split-debug.c +++ b/clang/test/Driver/split-debug.c @@ -24,6 +24,14 @@ /// -gsplit-dwarf is a no-op if no -g is specified. // RUN: %clang -### -c -target x86_64 -gsplit-dwarf %s 2>&1 | FileCheck %s --check-prefix=G0 +/// ... unless -fthinlto-index= is specified. +// RUN: echo > %t.bc +// RUN: %clang -### -c -target x86_64 -fthinlto-index=dummy -gsplit-dwarf %t.bc 2>&1 | FileCheck %s --check-prefix=THINLTO + +// THINLTO-NOT: "-debug-info-kind= +// THINLTO: "-ggnu-pubnames" +// THINLTO-SAME: "-split-dwarf-file" "{{.*}}.dwo" "-split-dwarf-output" "{{.*}}.dwo" + /// -gno-split-dwarf disables debug fission. // RUN: %clang -### -c -target x86_64 -gsplit-dwarf -g -gno-split-dwarf %s 2>&1 | FileCheck %s --check-prefix=NOSPLIT // RUN: %clang -### -c -target x86_64 -gsplit-dwarf=single -g -gno-split-dwarf %s 2>&1 | FileCheck %s --check-prefix=NOSPLIT diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h index ac445e556ba1f1..b9c30abcb579e3 100644 --- a/llvm/include/llvm/ADT/SmallVector.h +++ b/llvm/include/llvm/ADT/SmallVector.h @@ -545,11 +545,9 @@ class SmallVectorImpl : public SmallVectorTemplateBase { private: template void resizeImpl(size_type N) { if (N < this->size()) { - this->destroy_range(this->begin()+N, this->end()); - this->set_size(N); + this->pop_back_n(this->size() - N); } else if (N > this->size()) { - if (this->capacity() < N) - this->grow(N); + this->reserve(N); for (auto I = this->end(), E = this->begin() + N; I != E; ++I) if (ForOverwrite) new (&*I) T; @@ -570,8 +568,7 @@ class SmallVectorImpl : public SmallVectorTemplateBase { return; if (N < this->size()) { - this->destroy_range(this->begin()+N, this->end()); - this->set_size(N); + this->pop_back_n(this->size() - N); return; } @@ -606,9 +603,7 @@ class SmallVectorImpl : public SmallVectorTemplateBase { void append(in_iter in_start, in_iter in_end) { this->assertSafeToAddRange(in_start, in_end); size_type NumInputs = std::distance(in_start, in_end); - if (NumInputs > this->capacity() - this->size()) - this->grow(this->size()+NumInputs); - + this->reserve(this->size() + NumInputs); this->uninitialized_copy(in_start, in_end, this->end()); this->set_size(this->size() + NumInputs); } @@ -630,8 +625,7 @@ class SmallVectorImpl : public SmallVectorTemplateBase { void assign(size_type NumElts, const T &Elt) { this->assertSafeToReferenceAfterResize(&Elt, 0); clear(); - if (this->capacity() < NumElts) - this->grow(NumElts); + this->reserve(NumElts); this->set_size(NumElts); std::uninitialized_fill(this->begin(), this->end(), Elt); } @@ -892,10 +886,8 @@ void SmallVectorImpl::swap(SmallVectorImpl &RHS) { std::swap(this->Capacity, RHS.Capacity); return; } - if (RHS.size() > this->capacity()) - this->grow(RHS.size()); - if (this->size() > RHS.capacity()) - RHS.grow(this->size()); + this->reserve(RHS.size()); + RHS.reserve(this->size()); // Swap the shared elements. size_t NumShared = this->size(); @@ -950,8 +942,7 @@ SmallVectorImpl &SmallVectorImpl:: // FIXME: don't do this if they're efficiently moveable. if (this->capacity() < RHSSize) { // Destroy current elements. - this->destroy_range(this->begin(), this->end()); - this->set_size(0); + this->clear(); CurSize = 0; this->grow(RHSSize); } else if (CurSize) { @@ -1010,8 +1001,7 @@ SmallVectorImpl &SmallVectorImpl::operator=(SmallVectorImpl &&RHS) { // elements. if (this->capacity() < RHSSize) { // Destroy current elements. - this->destroy_range(this->begin(), this->end()); - this->set_size(0); + this->clear(); CurSize = 0; this->grow(RHSSize); } else if (CurSize) { diff --git a/llvm/include/llvm/Config/llvm-config.h.cmake b/llvm/include/llvm/Config/llvm-config.h.cmake index 7ee9f657c8a137..43107b086999d4 100644 --- a/llvm/include/llvm/Config/llvm-config.h.cmake +++ b/llvm/include/llvm/Config/llvm-config.h.cmake @@ -16,7 +16,7 @@ /* Indicate that this is LLVM compiled from the amd-gfx branch. */ #define LLVM_HAVE_BRANCH_AMD_GFX -#define LLVM_MAIN_REVISION 376986 +#define LLVM_MAIN_REVISION 376990 /* Define if LLVM_ENABLE_DUMP is enabled */ #cmakedefine LLVM_ENABLE_DUMP