================
@@ -2642,12 +2642,80 @@ static RValue 
EmitHipStdParUnsupportedBuiltin(CodeGenFunction *CGF,
   return RValue::get(CGF->Builder.CreateCall(UBF, Args));
 }
 
+/// Determines whether we should treat a given built-in as a call to an
+/// artificial inlined function in debug info.
+static bool shouldUseBuiltinDebugLocation(unsigned BuiltinID) {
+  switch (BuiltinID) {
+  case Builtin::BI__builtin_unpredictable:
+  case Builtin::BI__builtin_expect:
+  case Builtin::BI__builtin_expect_with_probability:
+  case Builtin::BI__builtin_assume_aligned:
+  case Builtin::BI__builtin_assume_dereferenceable:
+  case Builtin::BI__assume:
+  case Builtin::BI__builtin_assume:
+  case Builtin::BI__builtin_assume_separate_storage:
+  case Builtin::BI__builtin_allow_runtime_check:
+  case Builtin::BI__builtin_allow_sanitize_check:
+  case Builtin::BI__builtin_constant_p:
+  case Builtin::BI__builtin_prefetch:
+  case Builtin::BI__builtin___clear_cache:
+  case Builtin::BI__builtin_unreachable: {
+    // Exclude optimisation hint built-ins. These are a form of communicating
+    // additional constraints to the compiler.
+    return false;
+  }
+  case Builtin::BI__builtin_trap:
+  case Builtin::BI__builtin_verbose_trap:
+  case Builtin::BI__debugbreak:
+  case Builtin::BI__builtin_eh_return:
+  case Builtin::BI__builtin_unwind_init:
+  case Builtin::BI__exception_code:
+  case Builtin::BI_exception_code:
+  case Builtin::BI__exception_info:
+  case Builtin::BI_exception_info:
+  case Builtin::BI__abnormal_termination:
+  case Builtin::BI_abnormal_termination: {
+    // Exclude trap and exception built-ins. These may use their own debug
+    // location handling, so we avoid making debug changes so they may inspect
+    // the caller as-is without additional debug info layers.
+    return false;
+  }
+  case Builtin::BI__annotation:
+  case Builtin::BI__builtin_annotation: {
+    // Exclude annotation built-ins. These attach debug-time information.
+    return false;
+  }
+  case Builtin::BI__builtin_operator_new:
+  case Builtin::BI__builtin_operator_delete: {
+    // Exclude C++ operator built-ins. These are emitted as normal calls.
+    return false;
+  }
+  }
+
+  // Most generic (non-target-specific) built-ins are call-like, so we default
+  // to enabling this debug info treatment.
+  return true;
+
+  // See also further exclusions of library functions emitted as normal calls
+  // and target-specific built-ins towards the end of `EmitBuiltinExpr` which
+  // overrides the value returned here.
+}
+
 RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned 
BuiltinID,
                                         const CallExpr *E,
                                         ReturnValueSlot ReturnValue) {
   assert(!getContext().BuiltinInfo.isImmediate(BuiltinID) &&
          "Should not codegen for consteval builtins");
 
+  // Treat built-in as call to artificial inlined function in debug info.
+  // This enables e.g. profiling tools to annotate time spent in user-called
+  // built-ins with the built-in function name.
+  // See `useBuiltinDebugLocation` for cases where this treatment is disabled.
+  auto DebugScope =
----------------
jryans wrote:

I have added an enabled-by-default flag controlling this. The behaviour can be 
disabled with `-gno-inlined-builtins` when needed.

https://github.com/llvm/llvm-project/pull/189969
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to