Code generate secp256k1 modules into header files
This commit is contained in:
		
							parent
							
								
									3a9c1dc4bf
								
							
						
					
					
						commit
						2efe69b68e
					
				| @ -29,7 +29,6 @@ definitive explanations). | ||||
| #define ECMULT_GEN_PREC_BITS 4 | ||||
| #define ECMULT_WINDOW_SIZE 15 | ||||
| #include "bt_secp256k1_i64.h" | ||||
| #include <stdio.h> | ||||
| ``` | ||||
| 
 | ||||
| ## Details | ||||
|  | ||||
| @ -4,6 +4,10 @@ | ||||
| #define BT_SECP256K1_IMPLEMENTATION | ||||
| // NOTE: The 2 following defines are optional! We provide a default value if
 | ||||
| // these are not defined before the implementation
 | ||||
| #define ENABLE_MODULE_ECDH | ||||
| #define ENABLE_MODULE_RECOVERY | ||||
| #define ENABLE_MODULE_EXTRAKEYS | ||||
| #define ENABLE_MODULE_SCHNORRSIG | ||||
| #define ECMULT_GEN_PREC_BITS 4 | ||||
| #define ECMULT_WINDOW_SIZE 15 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										1553
									
								
								bt_secp256k1_i128.h
									
									
									
									
									
								
							
							
						
						
									
										1553
									
								
								bt_secp256k1_i128.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1544
									
								
								bt_secp256k1_i64.h
									
									
									
									
									
								
							
							
						
						
									
										1544
									
								
								bt_secp256k1_i64.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -46,11 +46,11 @@ struct StringList { String string; StringList *next; }; | ||||
| 
 | ||||
| struct LoadedFile | ||||
| { | ||||
|     unsigned  flag; | ||||
|     char     *buffer; | ||||
|     int       size; | ||||
|     String    sub_dir; | ||||
|     String    name; | ||||
|     unsigned  flag;              // Corresponds to FileFlag enum
 | ||||
|     String    buffer;            // The contents of the file loaded from disk
 | ||||
|     String    sub_dir;           // The sub directory that the file orginated from
 | ||||
|     String    name;              // The file name
 | ||||
|     String    module_macro_name; // For secp256k1 modules, the name of the C macro used to identify the file
 | ||||
| }; | ||||
| 
 | ||||
| FILE_SCOPE bool LoadFiles(LoadedFile *files, int file_count, char const *root_dir) | ||||
| @ -69,8 +69,8 @@ FILE_SCOPE bool LoadFiles(LoadedFile *files, int file_count, char const *root_di | ||||
|             snprintf(file_path, sizeof(file_path), "%s/%.*s", root_dir, file->name.size, file->name.str); | ||||
|         } | ||||
| 
 | ||||
|         file->buffer = ReadEntireFile(file_path, &file->size); | ||||
|         if (!file->buffer || file->size == 0) | ||||
|         file->buffer.str = ReadEntireFile(file_path, &file->buffer.size); | ||||
|         if (!file->buffer.str || file->buffer.size == 0) | ||||
|         { | ||||
|             fprintf(stderr, "Failed to load file [file=%s]\n", file_path); | ||||
|             result = false; | ||||
| @ -104,6 +104,17 @@ FILE_SCOPE StringList *StringListAppendRef(StringList *list, String string) | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| FILE_SCOPE StringList *StringListAppendCopy(StringList *list, String string) | ||||
| { | ||||
|     StringList *result = list; | ||||
|     if (string.str && string.size) | ||||
|     { | ||||
|         String copy = StringCopy(string); | ||||
|         result      = StringListAppendRef(result, copy); | ||||
|     } | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| FILE_SCOPE String StringListBuild(StringList *list) | ||||
| { | ||||
|     int total_size = 0; | ||||
| @ -211,7 +222,10 @@ FILE_SCOPE String StringReplace(String src, String find, String replace) | ||||
| 
 | ||||
| StringList *AddSourceFileComment(StringList *tail, LoadedFile const *file) | ||||
| { | ||||
|     StringList *result = StringListAppendRef(tail, STRING("\n// File: ")); | ||||
|     StringList *result = StringListAppendRef(tail, STRING( | ||||
|     "// -----------------------------------------------------------------------------\n" | ||||
|     "// File: " | ||||
|     )); | ||||
|     if (file->sub_dir.size) | ||||
|     { | ||||
|         result = StringListAppendRef(result, file->sub_dir); | ||||
| @ -220,6 +234,7 @@ StringList *AddSourceFileComment(StringList *tail, LoadedFile const *file) | ||||
| 
 | ||||
|     result = StringListAppendRef(result, file->name); | ||||
|     result = StringListAppendRef(result, STRING("\n")); | ||||
|     result = StringListAppendRef(result, STRING("// -----------------------------------------------------------------------------\n")); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| @ -232,61 +247,76 @@ int main(int argc, char *argv[]) | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     // NOTE: Load files into memory
 | ||||
|     LoadedFile intro_files[] = { | ||||
|         {FileFlag_Normal, nullptr, 0, STRING(""), STRING("COPYING")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING(""), STRING("COPYING"), STRING("")}, | ||||
|     }; | ||||
| 
 | ||||
|     LoadedFile header_files[] = { | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1.h")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1_preallocated.h")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1.h"), STRING("")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1_preallocated.h"), STRING("")}, | ||||
|     }; | ||||
| 
 | ||||
|     LoadedFile extra_module_header_files[] = { | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1_ecdh.h"), STRING("ECDH")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1_recovery.h"), STRING("RECOVERY")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1_extrakeys.h"), STRING("EXTRAKEYS")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("include"), STRING("secp256k1_schnorrsig.h"), STRING("SCHNORRSIG")}, | ||||
|     }; | ||||
| 
 | ||||
|     LoadedFile private_header_files[] = { | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("util.h")}, | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("field_10x26.h")}, | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("scalar_8x32.h")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("field_5x52.h")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("scalar_4x64.h")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("modinv64.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("hash.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("modinv32.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("assumptions.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scalar.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("field.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("group.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_const.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_gen.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scratch.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult_gen.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecdsa.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("eckey.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("selftest.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("util.h"), STRING("")}, | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("field_10x26.h"), STRING("")}, | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("scalar_8x32.h"), STRING("")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("field_5x52.h"), STRING("")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("scalar_4x64.h"), STRING("")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("modinv64.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("hash.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("modinv32.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("assumptions.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scalar.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("field.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("group.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_const.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_gen.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scratch.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult_gen.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecdsa.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("eckey.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("selftest.h"), STRING("")}, | ||||
|     }; | ||||
| 
 | ||||
|     LoadedFile private_impl_files[] = { | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("field_10x26_impl.h")}, | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("scalar_8x32_impl.h")}, | ||||
|         {FileFlag_AsmInt128,     nullptr, 0, STRING("src"), STRING("field_5x52_int128_impl.h")}, | ||||
|         {FileFlag_AsmX86_64,     nullptr, 0, STRING("src"), STRING("field_5x52_asm_impl.h")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("field_5x52_impl.h")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("scalar_4x64_impl.h")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("modinv64_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecdsa_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("eckey_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("group_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("field_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scalar_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_const_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_gen_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult.c")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult_gen.c")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("hash_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("modinv32_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scratch_impl.h")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("secp256k1.c")}, | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("field_10x26_impl.h"), STRING("")}, | ||||
|         {FileFlag_Mul64Support,  nullptr, 0, STRING("src"), STRING("scalar_8x32_impl.h"), STRING("")}, | ||||
|         {FileFlag_AsmInt128,     nullptr, 0, STRING("src"), STRING("field_5x52_int128_impl.h"), STRING("")}, | ||||
|         {FileFlag_AsmX86_64,     nullptr, 0, STRING("src"), STRING("field_5x52_asm_impl.h"), STRING("")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("field_5x52_impl.h"), STRING("")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("scalar_4x64_impl.h"), STRING("")}, | ||||
|         {FileFlag_Mul128Support, nullptr, 0, STRING("src"), STRING("modinv64_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecdsa_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("eckey_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("group_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("field_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scalar_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_const_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("ecmult_gen_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult.c"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("precomputed_ecmult_gen.c"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("hash_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("modinv32_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("scratch_impl.h"), STRING("")}, | ||||
|         {FileFlag_Normal,        nullptr, 0, STRING("src"), STRING("secp256k1.c"), STRING("")}, | ||||
|     }; | ||||
| 
 | ||||
|     LoadedFile private_extra_module_impl_files[] = { | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("src/modules/ecdh"), STRING("main_impl.h"), STRING("ECDH")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("src/modules/recovery"), STRING("main_impl.h"), STRING("RECOVERY")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("src/modules/extrakeys"), STRING("main_impl.h"), STRING("EXTRAKEYS")}, | ||||
|         {FileFlag_Normal, nullptr, 0, STRING("src/modules/schnorrsig"), STRING("main_impl.h"), STRING("SCHNORRSIG")}, | ||||
|     }; | ||||
| 
 | ||||
|     #define ARRAY_COUNT(array) sizeof(array)/sizeof((array)[0]) | ||||
| @ -294,18 +324,62 @@ int main(int argc, char *argv[]) | ||||
|     bool        files_loaded = true; | ||||
|     files_loaded &= LoadFiles(intro_files, ARRAY_COUNT(intro_files), root_dir); | ||||
|     files_loaded &= LoadFiles(header_files, ARRAY_COUNT(header_files), root_dir); | ||||
|     files_loaded &= LoadFiles(extra_module_header_files, ARRAY_COUNT(extra_module_header_files), root_dir); | ||||
|     files_loaded &= LoadFiles(private_header_files, ARRAY_COUNT(private_header_files), root_dir); | ||||
|     files_loaded &= LoadFiles(private_impl_files, ARRAY_COUNT(private_impl_files), root_dir); | ||||
|     files_loaded &= LoadFiles(private_extra_module_impl_files, ARRAY_COUNT(private_extra_module_impl_files), root_dir); | ||||
| 
 | ||||
|     if (!files_loaded) | ||||
|         return -1; | ||||
| 
 | ||||
|     // NOTE: Patch problematic source code before code generation
 | ||||
|     { | ||||
|         for (LoadedFile &file : private_header_files) | ||||
|         { | ||||
|             if (StringEquals(file.name, STRING("util.h"))) | ||||
|             { | ||||
|                 // NOTE: Fix implicit cast from void to unsigned char C++ error
 | ||||
|                 file.buffer = StringReplace( | ||||
|                     file.buffer, | ||||
|                     STRING("const unsigned char *p1 = s1, *p2 = s2;"), | ||||
|                     STRING("const unsigned char *p1 = (const unsigned char *)s1, *p2 = (const unsigned char *)s2;")); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         for (LoadedFile &file : private_impl_files) | ||||
|         { | ||||
|             if (StringEquals(file.name, STRING("secp256k1.c"))) | ||||
|             { | ||||
|                 // NOTE: Patch out module includes, we insert them manually after
 | ||||
|                 // the main implementation file
 | ||||
|                 file.buffer = StringFindThenInsert(file.buffer, STRING("# include \"modules"), STRING("// ")); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         for (LoadedFile &file : private_extra_module_impl_files) | ||||
|         { | ||||
|             // NOTE: modules all use relative headers, so patch them out early.
 | ||||
|             file.buffer = StringFindThenInsert(file.buffer, STRING("#include"), STRING("// ")); | ||||
| 
 | ||||
|             if (StringEquals(file.sub_dir, STRING("src/modules/schnorrsig")) && StringEquals(file.name, STRING("main_impl.h"))) | ||||
|             { | ||||
|                 // NOTE: Fix implicit cast from void to unsigned char C++ error
 | ||||
|                 file.buffer = StringReplace(file.buffer, | ||||
|                                             STRING("secp256k1_sha256_write(&sha, data, 32)"), | ||||
|                                             STRING("secp256k1_sha256_write(&sha, (const unsigned char *)data, 32)")); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     unsigned const BUILD_FLAGS[] = { | ||||
|         FileFlag_Normal | FileFlag_Mul64Support, | ||||
|         FileFlag_Normal | FileFlag_Mul128Support | FileFlag_AsmInt128, | ||||
|         FileFlag_Normal | FileFlag_Mul128Support | FileFlag_AsmX86_64, | ||||
|     }; | ||||
| 
 | ||||
|     // NOTE: Code generate
 | ||||
|     for (int build_index = 0; build_index < ARRAY_COUNT(BUILD_FLAGS); build_index++) | ||||
|     { | ||||
|         unsigned const build_flags = BUILD_FLAGS[build_index]; | ||||
| @ -362,7 +436,7 @@ int main(int argc, char *argv[]) | ||||
|             for (LoadedFile const &file : intro_files) | ||||
|             { | ||||
|                 if (build_flags & file.flag) | ||||
|                     list_tail = StringListAppendRef(list_tail, String{file.buffer, file.size}); | ||||
|                     list_tail = StringListAppendRef(list_tail, file.buffer); | ||||
|             } | ||||
|             list_tail = StringListAppendRef(list_tail, STRING("*/\n")); | ||||
| 
 | ||||
| @ -434,7 +508,7 @@ int main(int argc, char *argv[]) | ||||
|             "#endif\n" | ||||
|             "\n" | ||||
|             "// -----------------------------------------------------------------------------\n" | ||||
|             "// NOTE: Single Header Start\n" | ||||
|             "// NOTE: Header Start\n" | ||||
|             "// -----------------------------------------------------------------------------\n" | ||||
|             )); | ||||
| 
 | ||||
| @ -456,15 +530,59 @@ int main(int argc, char *argv[]) | ||||
|                 if (build_flags & file.flag) | ||||
|                 { | ||||
|                     list_tail = AddSourceFileComment(list_tail, &file); | ||||
|                     list_tail = StringListAppendRef(list_tail, String{file.buffer, file.size}); | ||||
|                     list_tail = StringListAppendRef(list_tail, file.buffer); | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING("\n")); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // -------------------------------------------------------------------------------------
 | ||||
|             // Extra Module Header files
 | ||||
|             // -------------------------------------------------------------------------------------
 | ||||
|             for (LoadedFile const &file : extra_module_header_files) | ||||
|             { | ||||
|                 if (build_flags & file.flag) | ||||
|                 { | ||||
|                     // NOTE: These are optional, conditionally defined based on
 | ||||
|                     // the ENABLE_MODULE_* macro
 | ||||
|                     char macro_name_buf[256]; | ||||
| 
 | ||||
|                     String macro_name = {}; | ||||
|                     macro_name.str    = macro_name_buf; | ||||
|                     macro_name.size   = snprintf(macro_name_buf, | ||||
|                                                  sizeof(macro_name_buf), | ||||
|                                                  "ENABLE_MODULE_%.*s", | ||||
|                                                  file.module_macro_name.size, | ||||
|                                                  file.module_macro_name.str); | ||||
| 
 | ||||
|                     list_tail = AddSourceFileComment(list_tail, &file); | ||||
| 
 | ||||
|                     // NOTE: Begin the conditional macro
 | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING("#if defined(")); | ||||
|                     list_tail = StringListAppendCopy(list_tail, macro_name); | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING(")\n")); | ||||
| 
 | ||||
|                     // NOTE: Write file
 | ||||
|                     list_tail = StringListAppendRef(list_tail, file.buffer); | ||||
| 
 | ||||
|                     // NOTE: End the conditional macro
 | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING("#endif //")); | ||||
|                     list_tail = StringListAppendCopy(list_tail, macro_name); | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING("\n\n")); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             list_tail = StringListAppendRef(list_tail, STRING("#endif // BT_SECP256K1_H\n")); | ||||
| 
 | ||||
|             // -------------------------------------------------------------------------------------
 | ||||
|             // Add implementation defines
 | ||||
|             // -------------------------------------------------------------------------------------
 | ||||
|             list_tail = StringListAppendRef(list_tail, STRING("#if defined(BT_SECP256K1_IMPLEMENTATION)\n")); | ||||
|             list_tail = StringListAppendRef(list_tail, STRING( | ||||
|             "\n" | ||||
|             "// -----------------------------------------------------------------------------\n" | ||||
|             "// NOTE: Implementation Start\n" | ||||
|             "// -----------------------------------------------------------------------------\n" | ||||
|             "#if defined(BT_SECP256K1_IMPLEMENTATION)\n" | ||||
|             )); | ||||
| 
 | ||||
|             { | ||||
|                 list_tail = StringListAppendRef(list_tail, STRING("#if !defined(ECMULT_GEN_PREC_BITS)\n")); | ||||
| @ -529,7 +647,7 @@ int main(int argc, char *argv[]) | ||||
|                 if (build_flags & file.flag) | ||||
|                 { | ||||
|                     list_tail = AddSourceFileComment(list_tail, &file); | ||||
|                     list_tail = StringListAppendRef(list_tail, String{file.buffer, file.size}); | ||||
|                     list_tail = StringListAppendRef(list_tail, file.buffer); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
| @ -538,7 +656,40 @@ int main(int argc, char *argv[]) | ||||
|                 if (build_flags & file.flag) | ||||
|                 { | ||||
|                     list_tail = AddSourceFileComment(list_tail, &file); | ||||
|                     list_tail = StringListAppendRef(list_tail, String{file.buffer, file.size}); | ||||
|                     list_tail = StringListAppendRef(list_tail, file.buffer); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             for (LoadedFile const &file : private_extra_module_impl_files) | ||||
|             { | ||||
|                 if (build_flags & file.flag) | ||||
|                 { | ||||
|                     // NOTE: These are optional, conditionally defined based on
 | ||||
|                     // the ENABLE_MODULE_* macro
 | ||||
|                     char macro_name_buf[256]; | ||||
| 
 | ||||
|                     String macro_name = {}; | ||||
|                     macro_name.str    = macro_name_buf; | ||||
|                     macro_name.size   = snprintf(macro_name_buf, | ||||
|                                                  sizeof(macro_name_buf), | ||||
|                                                  "ENABLE_MODULE_%.*s", | ||||
|                                                  file.module_macro_name.size, | ||||
|                                                  file.module_macro_name.str); | ||||
| 
 | ||||
|                     list_tail = AddSourceFileComment(list_tail, &file); | ||||
| 
 | ||||
|                     // NOTE: Begin the conditional macro
 | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING("#if defined(")); | ||||
|                     list_tail = StringListAppendCopy(list_tail, macro_name); | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING(")\n")); | ||||
| 
 | ||||
|                     // NOTE: Write file
 | ||||
|                     list_tail = StringListAppendRef(list_tail, file.buffer); | ||||
| 
 | ||||
|                     // NOTE: End the conditional macro
 | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING("#endif //")); | ||||
|                     list_tail = StringListAppendCopy(list_tail, macro_name); | ||||
|                     list_tail = StringListAppendRef(list_tail, STRING("\n\n")); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
| @ -573,8 +724,10 @@ int main(int argc, char *argv[]) | ||||
| 
 | ||||
|             LoadedFileList file_list[] = { | ||||
|                 {header_files, ARRAY_COUNT(header_files)}, | ||||
|                 {extra_module_header_files, ARRAY_COUNT(extra_module_header_files)}, | ||||
|                 {private_header_files, ARRAY_COUNT(private_header_files)}, | ||||
|                 {private_impl_files, ARRAY_COUNT(private_impl_files)}, | ||||
|                 {private_extra_module_impl_files, ARRAY_COUNT(private_extra_module_impl_files)}, | ||||
|             }; | ||||
| 
 | ||||
|             for (LoadedFileList const &list : file_list) | ||||
| @ -605,15 +758,8 @@ int main(int argc, char *argv[]) | ||||
| 
 | ||||
|         // NOTE: Misc patches to source code
 | ||||
|         { | ||||
|             // NOTE: Patch one problematic line that causes a compile failure in
 | ||||
|             // C++ (but not C, since this a C library).
 | ||||
|             buffer = StringReplace( | ||||
|                 buffer, | ||||
|                 STRING("const unsigned char *p1 = s1, *p2 = s2;"), | ||||
|                 STRING("const unsigned char *p1 = (const unsigned char *)s1, *p2 = (const unsigned char *)s2;")); | ||||
| 
 | ||||
|             // NOTE: Delete any Windows style new-lines if there were any
 | ||||
|             buffer = StringReplace(buffer, STRING("\r"), STRING("")); | ||||
|             // buffer = StringReplace(buffer, STRING("\r"), STRING(""));
 | ||||
|         } | ||||
| 
 | ||||
|         // NOTE: Output file
 | ||||
|  | ||||
							
								
								
									
										23
									
								
								build.bat
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								build.bat
									
									
									
									
									
								
							| @ -15,7 +15,7 @@ set common_linker_flags=-link -nologo | ||||
| 
 | ||||
| REM Build the metaprogram | ||||
| pushd !build_dir! | ||||
|     cl !common_compiler_flags! !code_dir!\bt_secp256k1_metaprogram.cpp !common_linker_flags! || ( | ||||
|     cl !common_compile_flags! !code_dir!\bt_secp256k1_metaprogram.cpp !common_linker_flags! || ( | ||||
|         echo Build script failed because the metaprogram failed to build successfully | ||||
|         exit | ||||
|     ) | ||||
| @ -26,24 +26,3 @@ REM Code generate the single file header | ||||
|     echo Build script failed because the metaprogram did not run successfully | ||||
|     exit | ||||
| ) | ||||
| 
 | ||||
| REM Build the test program to sanity check the single file header | ||||
| pushd !build_dir! | ||||
|     set common_source_files=!code_dir!\bt_secp256k1_example.c | ||||
| 
 | ||||
|     REM Build a C/C++ i64 version | ||||
|     cl !common_compile_flags! -Tc !common_source_files! !common_linker_flags! -out:bt_secp256k1_i64_example_c.exe | ||||
|     cl !common_compile_flags! -Tp !common_source_files! !common_linker_flags! -out:bt_secp256k1_i64_example_cpp.exe | ||||
| 
 | ||||
|     where /q clang-cl || ( | ||||
|       exit | ||||
|     ) | ||||
| 
 | ||||
|     REM (Optional) Build a C/C++ {i128, i128 x86_64 ASM} version | ||||
|     REM This requires clang-cl because MSVC does not expose a uint128_t type | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128            -Tc !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_example_c.exe | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128_X86_64_ASM -Tc !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_x86_64_asm_example_c.exe | ||||
| 
 | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128            -Tp !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_example_cpp.exe | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128_X86_64_ASM -Tp !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_x86_64_asm_example_cpp.exe | ||||
| popd | ||||
|  | ||||
							
								
								
									
										35
									
								
								build_examples.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								build_examples.bat
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| @echo off | ||||
| setlocal EnableDelayedExpansion | ||||
| 
 | ||||
| where /q cl || ( | ||||
|   echo MSVC's cl is not found - please run this from the MSVC x64 native tools command prompt | ||||
|   exit /b 1 | ||||
| ) | ||||
| 
 | ||||
| set code_dir=%~dp0 | ||||
| set build_dir=!code_dir!\build | ||||
| if not exist !build_dir! mkdir !build_dir! | ||||
| 
 | ||||
| set common_compile_flags=-W4 -Z7 | ||||
| set common_linker_flags=-link -nologo | ||||
| 
 | ||||
| REM Build the test program to sanity check the single file header | ||||
| pushd !build_dir! | ||||
|     set common_source_files=!code_dir!\bt_secp256k1_example.c | ||||
| 
 | ||||
|     REM Build a C/C++ i64 version | ||||
|     cl !common_compile_flags! -Tc !common_source_files! !common_linker_flags! -out:bt_secp256k1_i64_example_c.exe | ||||
|     cl !common_compile_flags! -Tp !common_source_files! !common_linker_flags! -out:bt_secp256k1_i64_example_cpp.exe | ||||
| 
 | ||||
|     where /q clang-cl || ( | ||||
|       exit | ||||
|     ) | ||||
| 
 | ||||
|     REM (Optional) Build a C/C++ {i128, i128 x86_64 ASM} version | ||||
|     REM This requires clang-cl because MSVC does not expose a uint128_t type | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128            -Tc !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_example_c.exe | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128_X86_64_ASM -Tc !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_x86_64_asm_example_c.exe | ||||
| 
 | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128            -Tp !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_example_cpp.exe | ||||
|     clang-cl !common_compile_flags! -D EXAMPLE_BUILD_I128_X86_64_ASM -Tp !common_source_files! !common_linker_flags! -out:bt_secp256k1_i128_x86_64_asm_example_cpp.exe | ||||
| popd | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user