This seems like a generally useful idea - certainly more valuable than storing+printing the function name.
You might want to look at the BUG patches I wrote, which are currently in -mm. I added general machinery to allow architectures to easily implement BUG() efficiently (ie, with a minimal amount of BUG-related icache pollution). If you were to store the BUG_ON expression, it would be best to extend struct bug_entry and store it there - doing it in asm-generic BUG_ON() means you still end up with code to set up the printk in the mainline code path, and it also won't honour CONFIG_DEBUG_BUGVERBOSE being disabled.