  namespace fuzzer {
  
  TracePC TPC;
-@@ -392,6 +400,15 @@ void TracePC::HandleCmp(uintptr_t PC, T Arg1, T Arg2) {
+@@ -392,6 +400,13 @@ void TracePC::HandleCmp(uintptr_t PC, T Arg1, T Arg2) {
    ValueProfileMap.AddValue(PC * 128 + 64 + AbsoluteDistance);
  }
  
 +ATTRIBUTE_TARGET_POPCNT ALWAYS_INLINE
 +ATTRIBUTE_NO_SANITIZE_ALL
 +void TracePC::HandleDf(uintptr_t PC, uintptr_t Addr, uintptr_t MaxPC) {
-+//fuzzer::Printf("[HandleDf] Instrumented : %lu\n", Addr);
 +  uintptr_t feature = PC * MaxPC + Addr;
-+//  fuzzer::Printf("[HandleDf] Feature value: %lu\n", feature);
 +  DataFlowMap.AddValue(feature);
 +}
 +
  ATTRIBUTE_NO_SANITIZE_MEMORY
  static size_t InternalStrnlen(const char *S, size_t MaxLen) {
    size_t Len = 0;
-@@ -616,6 +633,64 @@ void __sanitizer_cov_trace_gep(uintptr_t Idx) {
+@@ -616,6 +631,48 @@ void __sanitizer_cov_trace_gep(uintptr_t Idx) {
    fuzzer::TPC.HandleCmp(PC, Idx, (uintptr_t)0);
  }
  

 
 extern "C" {
 // This function should be defined by the user.
@@ -17,5 +18,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
 }  // extern "C"
 
 ATTRIBUTE_INTERFACE int main(int argc, char **argv) {
+  fuzzer::TPC.InitializeMainObjectInformation();
   return fuzzer::FuzzerDriver(&argc, &argv, LLVMFuzzerTestOneInput);
 }
diff --git a/compiler-rt/lib/fuzzer/FuzzerTracePC.cpp b/compiler-rt/lib/fuzzer/FuzzerTracePC.cpp
index f12f7aa61bc4..be01bc0c6510 100644
--- a/compiler-rt/lib/fuzzer/FuzzerTracePC.cpp
+++ b/compiler-rt/lib/fuzzer/FuzzerTracePC.cpp
@@ -27,6 +27,14 @@

   uintptr_t InitialStack;
 };
 
@@ -288,6 +294,12 @@ TracePC::CollectFeatures(Callback HandleFeature) const {
     FirstFeature += StackDepthStepFunction(std::numeric_limits<size_t>::max());
   }
 
+  // Data Flow feature
+  DataFlowMap.ForEach([&](size_t Idx) {
+    HandleFeature(static_cast<uint32_t>(FirstFeature + Idx));
+  });
+  FirstFeature += DataFlowMap.SizeInBits();
+
   return FirstFeature;
 }
 
