cross-checking external declarations / debug info for declarations

I am interested in putting together a tool which can verify that an external declaration conforms with the actual definition.

extern int32_t foo();
Int bar() { return foo(); }

int64_t foo() { … }

I had thought that I could use the debug information but the debug information in A.o does not include the type of the declaration “foo”, just the type of bar.

Is there a way to include declarations as well as definitions such as a above? It appears there is a notion of “retained” types, perhaps I add a flag to retain declarations?

Perhaps a different approach?