    #include <iostream>
    #include <vector>

    struct Callsite {
        const char* file_;
        size_t line_;
        
         static thread_local std::vector<Callsite*> callStack;
 
        Callsite(const char* file, size_t line) : file_(file), line_(line) {
            callStack.push_back(this);
        }
        ~Callsite() noexcept { callStack.pop_back(); }
    };
    
    thread_local std::vector<Callsite*> Callsite::callStack;

    #define ENTER  Callsite __callsite_entry(__FILE__, __LINE__);

    void f() {
        ENTER;

        for (auto&& stack: Callsite::callStack) {
            std::cout << stack->file_ << ":" << stack->line_ << "\n";
        }
    }

    int main() {
        ENTER;
        f();
    }
