[clang] [CodeGen] Disable exact dynamic_cast for duplicable vtables (PR #205929)

Akira Hatanaka via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 29 11:51:40 PDT 2026


================
@@ -1662,12 +1662,13 @@ def : Flag<["-"], "shared-libasan">, Alias<shared_libsan>;
 def : Flag<["-"], "static-libasan">, Alias<static_libsan>;
 def fasm : Flag<["-"], "fasm">, Group<f_Group>;
 
-defm assume_unique_vtables : BoolFOption<"assume-unique-vtables",
-  CodeGenOpts<"AssumeUniqueVTables">, DefaultTrue,
-  PosFlag<SetTrue>,
-  NegFlag<SetFalse, [], [ClangOption, CC1Option],
-          "Disable optimizations based on vtable pointer identity">,
-  BothFlags<[], [ClangOption, CLOption]>>;
+def fassume_unique_vtables : Flag<["-"], "fassume-unique-vtables">,
+  Group<f_Group>, Visibility<[ClangOption, CC1Option, CLOption]>,
+  HelpText<"Assume each polymorphic class has a single vtable with a unique "
+           "address, enabling optimizations based on vtable pointer identity">;
+def fno_assume_unique_vtables : Flag<["-"], "fno-assume-unique-vtables">,
+  Group<f_Group>, Visibility<[ClangOption, CC1Option, CLOption]>,
+  HelpText<"Disable optimizations based on vtable pointer identity">;
----------------
ahatanak wrote:

I went back and forth on this, but I think I'd keep the current spelling.

The internal policy is three-state, but those don't map one-to-one onto things a user should request. The middle value (`UniqueIfStrongLinkage`) is an ABI property (which vtables the target may duplicate), not a preference, and the only target that wants it (Apple Mach-O) already gets it as the default. There may be cases where requesting it elsewhere is useful (e.g., to let a target that has unique weak vtables still annotate them `unnamed_addr`), but that's something to support if someone actually asks for it and design carefully when we do. Since driver options are easy to add and hard to remove, I'd rather not expose that to the user now.

I also want to walk back what my patch does to `-fassume-unique-vtables`. It currently maps to `AlwaysUnique` and forces the optimization on, but originally it had no effect of its own. It existed only to cancel prior `-fno-assume-unique-vtables`. I'll restore that.

https://github.com/llvm/llvm-project/pull/205929


More information about the cfe-commits mailing list