The problem with analyzing the code with an automated tool is that you may find batches of files that link to each other, but the batch of files are never used. Conversely, there may be a file that is accessed directly, but doesn't use other files, nor is it included by any other files.
Typically what I do, in desperation, is add logging to each file. Simple write __FILE__
out to a log file when the file is accessed. This does add overhead across the board. But after a certain length of time, you then have your list of files are are actually accessed and used.
You could also analyze the log file on a regular basis and remove the logging from the files you know are used, reducing overhead as you go. In the end, you can search for files that still have your logging code to see which ones haven't been used.