[Orc] Teach the CompileOnDemand layer to clone aliases.
[oota-llvm.git] / lib / ExecutionEngine / Orc / IndirectionUtils.cpp
index 4ed873031482b8f76fc98d9cbdff7730e1bae228..ddd1921657b3324fe5f5d7a03b9b764150b3dfe0 100644 (file)
@@ -30,8 +30,6 @@ Constant* createIRTypedAddress(FunctionType &FT, TargetAddress Addr) {
 
 GlobalVariable* createImplPointer(PointerType &PT, Module &M,
                                   const Twine &Name, Constant *Initializer) {
-  if (!Initializer)
-    Initializer = Constant::getNullValue(&PT);
   auto IP = new GlobalVariable(M, &PT, false, GlobalValue::ExternalLinkage,
                                Initializer, Name, nullptr,
                                GlobalValue::NotThreadLocal, 0, true);
@@ -179,5 +177,19 @@ void moveGlobalVariableInitializer(GlobalVariable &OrigGV,
                                  nullptr, Materializer));
 }
 
+GlobalAlias* cloneGlobalAlias(Module &Dst, const GlobalAlias &OrigA,
+                              ValueToValueMapTy &VMap,
+                              ValueMaterializer *Materializer) {
+  assert(OrigA.getAliasee() && "Original alias doesn't have an aliasee?");
+  auto *NewA = GlobalAlias::create(OrigA.getValueType(),
+                                   OrigA.getType()->getPointerAddressSpace(),
+                                   OrigA.getLinkage(), OrigA.getName(), &Dst);
+  NewA->copyAttributesFrom(&OrigA);
+  VMap[&OrigA] = NewA;
+  NewA->setAliasee(cast<Constant>(MapValue(OrigA.getAliasee(), VMap, RF_None,
+                                           nullptr, Materializer)));
+  return NewA;
+}
+
 } // End namespace orc.
 } // End namespace llvm.