[ThinLTO] Fix memory corruption in ThinLTOCodeGenerator when CodeGenOnly was specified
authorSteven Wu <stevenwu@apple.com>
Tue, 4 Sep 2018 22:54:17 +0000 (22:54 +0000)
committerSteven Wu <stevenwu@apple.com>
Tue, 4 Sep 2018 22:54:17 +0000 (22:54 +0000)
commitcf90203b0be9a7f5e96207ccc4d94791ceb4079f
tree08adb59576dfe24174ddc2f040e187c5c5d32def
parent22ddc282b5df5b651bee678900788699dd70b95e
[ThinLTO] Fix memory corruption in ThinLTOCodeGenerator when CodeGenOnly was specified

Summary:
Issue occurs when doing ThinLTO with CodeGenOnly flag.
TMBuilder.TheTriple is assigned to by multiple threads in an unsafe way resulting in double-free of std::string memory.

Pseudocode:
if (CodeGenOnly) {
  // Perform only parallel codegen and return.
  ThreadPool Pool;
  int count = 0;
  for (auto &ModuleBuffer : Modules) {
    Pool.async([&](int count) {
    ...
      /// Now call OutputBuffer = codegen(*TheModule);
      /// Which turns into initTMBuilder(moduleTMBuilder, Triple(TheModule.getTargetTriple()));
      /// Which turns into

      TMBuilder.TheTriple = std::move(TheTriple);   // std::string = "....."
      /// So, basically std::string assignment to same string on multiple threads = memory corruption

  }

  return;
}

Patch by Alex Borcan

Reviewers: llvm-commits, steven_wu

Reviewed By: steven_wu

Subscribers: mehdi_amini, inglorion, eraman, steven_wu, dexonsmith, llvm-commits

Differential Revision: https://reviews.llvm.org/D51651

llvm-svn: 341422
llvm/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h
llvm/lib/LTO/ThinLTOCodeGenerator.cpp