// Tests that callback function whose address is taken is attached Type ID metadata // as it is a potential indirect call target. // RUN: %clang_cc1 -triple x86_64-unknown-linux -fexperimental-call-graph-section \ // RUN: -emit-llvm -o %t %s // RUN: FileCheck %s < %t //////////////////////////////////////////////////////////////////////////////// typedef void (*CallbackFn)(int); // Callback function with "internal" linkage. // CHECK-LABEL: define internal void @_ZL10myCallbacki( // CHECK-SAME: {{.*}} !type [[F_CALLBACK:![0-9]+]] static void myCallback(int value) { volatile int sink = value; (void)sink; } int takeCallbackAddress() { // Take the address of the callback explicitly (address-taken function) CallbackFn cb = &myCallback; // Store the address in a volatile pointer to keep it observable volatile void* addr = (void*)cb; (void)addr; return 0; } // CHECK: [[F_CALLBACK]] = !{i64 0, !"_ZTSFviE.generalized"}