================
@@ -0,0 +1,41 @@
+#ifdef LIBC_COPT_PRINTF_MODULAR
+#include "src/__support/arg_list.h"
+
+#define LIBC_PRINTF_DEFINE_MODULAR
+#include "src/stdio/printf_core/float_dec_converter.h"
+#include "src/stdio/printf_core/float_hex_converter.h"
+#include "src/stdio/printf_core/parser.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace printf_core {
+template class Parser<internal::ArgList>;
+template class Parser<internal::DummyArgList<false>>;
+template class Parser<internal::DummyArgList<true>>;
+template class Parser<internal::StructArgList<false>>;
+template class Parser<internal::StructArgList<true>>;
+
+#define INSTANTIATE_CONVERT_FN(NAME)                                           
\
+  template int NAME<WriteMode::FILL_BUFF_AND_DROP_OVERFLOW>(                   
\
+      Writer<WriteMode::FILL_BUFF_AND_DROP_OVERFLOW> * writer,                 
\
+      const FormatSection &to_conv);                                           
\
+  template int NAME<WriteMode::FLUSH_TO_STREAM>(                               
\
+      Writer<WriteMode::FLUSH_TO_STREAM> * writer,                             
\
+      const FormatSection &to_conv);                                           
\
+  template int NAME<WriteMode::RESIZE_AND_FILL_BUFF>(                          
\
+      Writer<WriteMode::RESIZE_AND_FILL_BUFF> * writer,                        
\
+      const FormatSection &to_conv);                                           
\
+  template int NAME<WriteMode::RUNTIME_DISPATCH>(                              
\
+      Writer<WriteMode::RUNTIME_DISPATCH> * writer,                            
\
+      const FormatSection &to_conv)
+
+INSTANTIATE_CONVERT_FN(convert_float_decimal);
+INSTANTIATE_CONVERT_FN(convert_float_dec_exp);
+INSTANTIATE_CONVERT_FN(convert_float_dec_auto);
+INSTANTIATE_CONVERT_FN(convert_float_hex_exp);
+
+} // namespace printf_core
+} // namespace LIBC_NAMESPACE_DECL
+
+// Bring this file into the link if __printf_float is referenced.
+extern "C" void __printf_float() {}
----------------
statham-arm wrote:

One risk with this strategy: what happens if this file is compiled with 
`-ffunction-sections`? Then `__printf_float` might be in a different code 
section from the template instantiations, and a linker might garbage-collect 
the functions you actually wanted, treating the weak references to them as not 
enough reason to keep them.

If I wanted to be sure of this technique, I'd either enforce via compile 
options that everything in this file is in the same code section, or else add 
further `BFD_RELOC_NONE` links from `__printf_float` to the payload functions, 
to make sure there's an unbroken chain of non-weak references from the import 
of `__printf_float` to the functions that actually do the work.

https://github.com/llvm/llvm-project/pull/147426
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to