#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();
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDx2ZWN0b3I+CgogICAgc3RydWN0IENhbGxzaXRlIHsKICAgICAgICBjb25zdCBjaGFyKiBmaWxlXzsKICAgICAgICBzaXplX3QgbGluZV87CiAgICAgICAgCiAgICAgICAgIHN0YXRpYyB0aHJlYWRfbG9jYWwgc3RkOjp2ZWN0b3I8Q2FsbHNpdGUqPiBjYWxsU3RhY2s7CiAKICAgICAgICBDYWxsc2l0ZShjb25zdCBjaGFyKiBmaWxlLCBzaXplX3QgbGluZSkgOiBmaWxlXyhmaWxlKSwgbGluZV8obGluZSkgewogICAgICAgICAgICBjYWxsU3RhY2sucHVzaF9iYWNrKHRoaXMpOwogICAgICAgIH0KICAgICAgICB+Q2FsbHNpdGUoKSBub2V4Y2VwdCB7IGNhbGxTdGFjay5wb3BfYmFjaygpOyB9CiAgICB9OwogICAgCiAgICB0aHJlYWRfbG9jYWwgc3RkOjp2ZWN0b3I8Q2FsbHNpdGUqPiBDYWxsc2l0ZTo6Y2FsbFN0YWNrOwoKICAgICNkZWZpbmUgRU5URVIgIENhbGxzaXRlIF9fY2FsbHNpdGVfZW50cnkoX19GSUxFX18sIF9fTElORV9fKTsKCiAgICB2b2lkIGYoKSB7CiAgICAgICAgRU5URVI7CgogICAgICAgIGZvciAoYXV0byYmIHN0YWNrOiBDYWxsc2l0ZTo6Y2FsbFN0YWNrKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGFjay0+ZmlsZV8gPDwgIjoiIDw8IHN0YWNrLT5saW5lXyA8PCAiXG4iOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgbWFpbigpIHsKICAgICAgICBFTlRFUjsKICAgICAgICBmKCk7CiAgICB9Cg==