The original fix (commit 23ec5782c3cc) of https://github.com/llvm/llvm-project/issues/52787 only adds Functions that have Instructions that directly use BlockAddresses into the bitcode (FUNC_CODE_BLOCKADDR_USERS).
However, in either @rickyz's original reproducing code:
void f(long); __attribute__((noinline)) static void fun(long x) { f(x + 1); } void repro(void) { fun(({ label: (long)&&label; })); }
... define dso_local void @repro() #0 { entry: br label %label label: ; preds = %entry tail call fastcc void @fun() ret void } define internal fastcc void @fun() unnamed_addr #1 { entry: tail call void @f(i64 add (i64 ptrtoint (i8* blockaddress(@repro, %label) to i64), i64 1)) #3 ret void } ...
or the xfs and overlayfs in the Linux kernel, BlockAddresses (e.g., i8* blockaddress(@repro, %label)) may first compose ConstantExprs (e.g., i64 ptrtoint (i8* blockaddress(@repro, %label) to i64)) and then used by Instructions. This case is not handled by the original fix.
This patch adds *indirect* users of BlockAddresses, i.e., the Instructions using some Constants which further use the BlockAddresses, into the bitcode as well, by doing depth-first searches.
Fixes: https://github.com/llvm/llvm-project/issues/52787
Fixes: 23ec5782c3cc ("[Bitcode] materialize Functions early when BlockAddress taken")
Consider adding test coverage for 3 different types of Users.