@@ -65,6 +65,8 @@ void TBDGenVisitor::addSymbolInternal(StringRef name,
6565  if  (StringSymbols && kind == SymbolKind::GlobalSymbol) {
6666    auto  isNewValue = StringSymbols->insert (name).second ;
6767    (void )isNewValue;
68+     if  (!isNewValue)
69+       llvm::errs () << " DUPLICATE: "   << name << " \n "  ;
6870    assert (isNewValue && " symbol appears twice"  );
6971  }
7072}
@@ -276,25 +278,55 @@ void TBDGenVisitor::addAutoDiffDerivativeFunction(
276278void  TBDGenVisitor::addDifferentiabilityWitness (
277279    AbstractFunctionDecl *original, IndexSubset *astParameterIndices,
278280    IndexSubset *resultIndices, GenericSignature derivativeGenericSignature) {
279-   if  (SILDeclRef (original).getLinkage (ForDefinition) != SILLinkage::Public)
281+   bool  foreign = requiresForeignEntryPoint (original);
282+   llvm::errs () << " TBDGenVisitor::addDifferentiabilityWitness: " 
283+   << original->getEffectiveFullName () << " , HAS CLANG? "   << original->hasClangNode () << " , FOREIGN: "   << foreign << " \n "  ;
284+   if  (!foreign) {
285+   if  (SILDeclRef (original).asForeign (foreign).getLinkage (ForDefinition) != SILLinkage::Public)
280286    return ;
287+   }
288+   //  original->dump();
289+   
290+ #if  0 
291+   if (SILDeclRef(original).asForeign(requiresForeignEntryPoint(original)).getLinkage(ForDefinition) != SILLinkage::Public)
292+     return;
293+ #endif 
281294
282295  auto  *silParamIndices = autodiff::getLoweredParameterIndices (
283296      astParameterIndices,
284297      original->getInterfaceType ()->castTo <AnyFunctionType>());
285298
299+   std::string originalMangledName = SILDeclRef (original).asForeign (requiresForeignEntryPoint (original)).mangle ();
300+ #if  0 
286301  std::string originalMangledName = SILDeclRef(original).mangle();
302+ #endif 
287303  AutoDiffConfig config{silParamIndices, resultIndices,
288304                        derivativeGenericSignature};
289305  SILDifferentiabilityWitnessKey key (originalMangledName, config);
290306
291307  Mangle::ASTMangler mangler;
292308  std::string mangledName = mangler.mangleSILDifferentiabilityWitnessKey (key);
293309  addSymbol (mangledName);
310+ #if  0 
311+   if (foreign) {
312+     std::string originalMangledName = SILDeclRef(original).asForeign(true).mangle();
313+     AutoDiffConfig config{silParamIndices, resultIndices,
314+                           derivativeGenericSignature};
315+     SILDifferentiabilityWitnessKey key(originalMangledName, config);
316+ 
317+     Mangle::ASTMangler mangler;
318+     std::string mangledName = mangler.mangleSILDifferentiabilityWitnessKey(key);
319+     addSymbol(mangledName);
320+   }
321+ #endif 
294322}
295323
296324void  TBDGenVisitor::addDerivativeConfiguration (AbstractFunctionDecl *original,
297325                                               AutoDiffConfig config) {
326+   auto  inserted = AddedDerivatives.insert ({original, config});
327+   if  (!inserted.second )
328+     return ;
329+ 
298330  addAutoDiffLinearMapFunction (original, config,
299331                               AutoDiffLinearMapKind::Differential);
300332  addAutoDiffLinearMapFunction (original, config,
@@ -374,9 +406,25 @@ void TBDGenVisitor::visitAbstractFunctionDecl(AbstractFunctionDecl *AFD) {
374406  }
375407
376408  //  SWIFT_ENABLE_TENSORFLOW
409+ #if  0 
377410  for (auto derivativeConfig : AFD->getDerivativeFunctionConfigurations()) {
378411    addDerivativeConfiguration(AFD, derivativeConfig);
379412  }
413+ #endif 
414+   for  (const  auto  *differentiableAttr :
415+        AFD->getAttrs ().getAttributes <DifferentiableAttr>())
416+     addDerivativeConfiguration (
417+         AFD,
418+         AutoDiffConfig (differentiableAttr->getParameterIndices (),
419+                        IndexSubset::get (AFD->getASTContext (), 1 , {0 }),
420+                        differentiableAttr->getDerivativeGenericSignature ()));
421+   for  (const  auto  *derivativeAttr :
422+        AFD->getAttrs ().getAttributes <DerivativeAttr>())
423+     addDerivativeConfiguration (
424+         derivativeAttr->getOriginalFunction (),
425+         AutoDiffConfig (derivativeAttr->getParameterIndices (),
426+                        IndexSubset::get (AFD->getASTContext (), 1 , {0 }),
427+                        AFD->getGenericSignature ()));
380428
381429  visitDefaultArguments (AFD, AFD->getParameters ());
382430}
@@ -430,6 +478,15 @@ void TBDGenVisitor::visitAbstractStorageDecl(AbstractStorageDecl *ASD) {
430478  ASD->visitEmittedAccessors ([&](AccessorDecl *accessor) {
431479    visitFuncDecl (accessor);
432480  });
481+ 
482+   //  SWIFT_ENABLE_TENSORFLOW
483+   for  (const  auto  *differentiableAttr :
484+        ASD->getAttrs ().getAttributes <DifferentiableAttr>())
485+     addDerivativeConfiguration (
486+         ASD->getAccessor (AccessorKind::Get),
487+         AutoDiffConfig (differentiableAttr->getParameterIndices (),
488+                        IndexSubset::get (ASD->getASTContext (), 1 , {0 }),
489+                        differentiableAttr->getDerivativeGenericSignature ()));
433490}
434491
435492void  TBDGenVisitor::visitVarDecl (VarDecl *VD) {
0 commit comments