Skip to content

Commit 3210647

Browse files
committed
[llvm-libtools-darwin] Don't use global LLVMContext
Fixes some initialization order fiasco issues https://lab.llvm.org/buildbot#builders/5/builds/20996
1 parent a3248e4 commit 3210647

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
using namespace llvm;
3333
using namespace llvm::object;
3434

35-
static LLVMContext LLVMCtx;
36-
3735
class NewArchiveMemberList;
3836
typedef std::map<uint64_t, NewArchiveMemberList> MembersPerArchitectureMap;
3937

@@ -269,7 +267,8 @@ class NewArchiveMemberList {
269267
// the user.
270268
class MembersBuilder {
271269
public:
272-
MembersBuilder(const Config &C) : C(C) {}
270+
MembersBuilder(LLVMContext &LLVMCtx, const Config &C)
271+
: LLVMCtx(LLVMCtx), C(C) {}
273272

274273
Expected<MembersData> build() {
275274
for (StringRef FileName : InputFiles)
@@ -396,7 +395,7 @@ class MembersBuilder {
396395
Error verifyAndAddIRObject(NewArchiveMember Member) {
397396
auto MBRef = Member.Buf->getMemBufferRef();
398397
Expected<std::unique_ptr<object::IRObjectFile>> IROrErr =
399-
object::IRObjectFile::create(MBRef, LLVMCtx);
398+
object::IRObjectFile::create(MBRef, Builder.LLVMCtx);
400399

401400
// Throw error if not a valid IR object file.
402401
if (!IROrErr)
@@ -488,7 +487,7 @@ class MembersBuilder {
488487
}
489488

490489
Expected<std::unique_ptr<IRObjectFile>> IRObjectOrError =
491-
O.getAsIRObject(LLVMCtx);
490+
O.getAsIRObject(Builder.LLVMCtx);
492491
if (IRObjectOrError) {
493492
// A universal file member can be a MachOObjectFile, an IRObject or an
494493
// Archive. In case we can successfully cast the member as an
@@ -533,11 +532,13 @@ class MembersBuilder {
533532
};
534533

535534
MembersData Data;
535+
LLVMContext &LLVMCtx;
536536
const Config &C;
537537
};
538538

539539
static Expected<SmallVector<Slice, 2>>
540-
buildSlices(ArrayRef<OwningBinary<Archive>> OutputBinaries) {
540+
buildSlices(LLVMContext &LLVMCtx,
541+
ArrayRef<OwningBinary<Archive>> OutputBinaries) {
541542
SmallVector<Slice, 2> Slices;
542543

543544
for (const auto &OB : OutputBinaries) {
@@ -585,8 +586,8 @@ checkForDuplicates(const MembersPerArchitectureMap &MembersPerArch) {
585586
return Error::success();
586587
}
587588

588-
static Error createStaticLibrary(const Config &C) {
589-
MembersBuilder Builder(C);
589+
static Error createStaticLibrary(LLVMContext &LLVMCtx, const Config &C) {
590+
MembersBuilder Builder(LLVMCtx, C);
590591
auto DataOrError = Builder.build();
591592
if (auto Error = DataOrError.takeError())
592593
return Error;
@@ -627,7 +628,7 @@ static Error createStaticLibrary(const Config &C) {
627628
OwningBinary<Archive>(std::move(A), std::move(OutputBuffer)));
628629
}
629630

630-
Expected<SmallVector<Slice, 2>> Slices = buildSlices(OutputBinaries);
631+
Expected<SmallVector<Slice, 2>> Slices = buildSlices(LLVMCtx, OutputBinaries);
631632
if (!Slices)
632633
return Slices.takeError();
633634

@@ -702,12 +703,13 @@ int main(int Argc, char **Argv) {
702703
llvm::InitializeAllTargetMCs();
703704
llvm::InitializeAllAsmParsers();
704705

706+
LLVMContext LLVMCtx;
705707
Config C = *ConfigOrErr;
706708
switch (LibraryOperation) {
707709
case Operation::None:
708710
break;
709711
case Operation::Static:
710-
if (Error E = createStaticLibrary(C)) {
712+
if (Error E = createStaticLibrary(LLVMCtx, C)) {
711713
WithColor::defaultErrorHandler(std::move(E));
712714
return EXIT_FAILURE;
713715
}

0 commit comments

Comments
 (0)