[LLVM] Resolve layer violation in BitcodeWriter
authorJoseph Huber <jhuber6@vols.utk.edu>
Mon, 31 Jan 2022 23:58:35 +0000 (18:58 -0500)
committerJoseph Huber <jhuber6@vols.utk.edu>
Tue, 1 Feb 2022 00:01:08 +0000 (19:01 -0500)
Summary:
The changes introduced in D116542 added a dependency on TransformUtils
to use the `appendToCompilerUsed` method. This created a circular
dependency. This patch simply copies the needed function locally to
remove the dependency.

llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
llvm/lib/Bitcode/Writer/CMakeLists.txt

index fafccb4..7ebe10e 100644 (file)
@@ -69,7 +69,6 @@
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/SHA1.h"
 #include "llvm/Support/raw_ostream.h"
-#include "llvm/Transforms/Utils/ModuleUtils.h"
 #include <algorithm>
 #include <cassert>
 #include <cstddef>
@@ -4975,6 +4974,39 @@ void llvm::EmbedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf,
   NewUsed->setSection("llvm.metadata");
 }
 
+static void appendToCompilerUsed(Module &M, ArrayRef<GlobalValue *> Values) {
+  GlobalVariable *GV = M.getGlobalVariable("llvm.compiler.used");
+  SmallPtrSet<Constant *, 16> InitAsSet;
+  SmallVector<Constant *, 16> Init;
+  if (GV) {
+    if (GV->hasInitializer()) {
+      auto *CA = cast<ConstantArray>(GV->getInitializer());
+      for (auto &Op : CA->operands()) {
+        Constant *C = cast_or_null<Constant>(Op);
+        if (InitAsSet.insert(C).second)
+          Init.push_back(C);
+      }
+    }
+    GV->eraseFromParent();
+  }
+
+  Type *Int8PtrTy = llvm::Type::getInt8PtrTy(M.getContext());
+  for (auto *V : Values) {
+    Constant *C = ConstantExpr::getPointerBitCastOrAddrSpaceCast(V, Int8PtrTy);
+    if (InitAsSet.insert(C).second)
+      Init.push_back(C);
+  }
+
+  if (Init.empty())
+    return;
+
+  ArrayType *ATy = ArrayType::get(Int8PtrTy, Init.size());
+  GV = new llvm::GlobalVariable(M, ATy, false, GlobalValue::AppendingLinkage,
+                                ConstantArray::get(ATy, Init),
+                                "llvm.compiler.used");
+  GV->setSection("llvm.metadata");
+}
+
 void llvm::EmbedBufferInModule(llvm::Module &M, llvm::MemoryBufferRef Buf,
                                StringRef SectionName) {
   ArrayRef<char> ModuleData =
index dcdb73b..36808c8 100644 (file)
@@ -11,7 +11,6 @@ add_llvm_component_library(LLVMBitWriter
   Analysis
   Core
   MC
-  TransformUtils
   Object
   Support
   )