From 29cf5596fe0c37213f9b74e80d8f631193a93f0f Mon Sep 17 00:00:00 2001 From: Juuso Alasuutari Date: Sat, 20 May 2023 15:58:15 +0300 Subject: [PATCH] llama : define magic numbers as integer constants (#1518) (#1520) The underlying representation of multibyte character literals is implementation-defined. This could, at least in principle, cause cross-build data export/import issues independent of endianness. Define magic numbers as integer literals to be on the safe side. Signed-off-by: Juuso Alasuutari --- llama.cpp | 40 ++++++++++++++++++++++------------------ llama.h | 12 +++++++++--- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/llama.cpp b/llama.cpp index b38d55dda..4cbc8d6b6 100644 --- a/llama.cpp +++ b/llama.cpp @@ -427,26 +427,30 @@ struct llama_file_loader { } void read_magic() { uint32_t magic = file.read_u32(); - uint32_t version = 0; - if (magic != 'ggml') { - version = file.read_u32(); - } - - if (magic == 'ggml' && version == 0) { + if (magic == LLAMA_FILE_MAGIC_GGML) { file_version = LLAMA_FILE_VERSION_GGML; - } else if (magic == 'ggmf' && version == 1) { - file_version = LLAMA_FILE_VERSION_GGMF_V1; - } else if (magic == 'ggjt' && version == 1) { - file_version = LLAMA_FILE_VERSION_GGJT_V1; - } else if (magic == 'ggjt' && version == 2) { - file_version = LLAMA_FILE_VERSION_GGJT_V2; - } else if (magic == 'ggjt' && version == 3) { - file_version = LLAMA_FILE_VERSION_GGJT_V3; - } else { - throw format("unknown (magic, version) combination: %08x, %08x; is this really a GGML file?", - magic, version); + return; } + + uint32_t version = file.read_u32(); + + switch (magic) { + case LLAMA_FILE_MAGIC_GGMF: + switch (version) { + case 1: file_version = LLAMA_FILE_VERSION_GGMF_V1; return; + } + break; + case LLAMA_FILE_MAGIC_GGJT: + switch (version) { + case 1: file_version = LLAMA_FILE_VERSION_GGJT_V1; return; + case 2: file_version = LLAMA_FILE_VERSION_GGJT_V2; return; + case 3: file_version = LLAMA_FILE_VERSION_GGJT_V3; return; + } + } + + throw format("unknown (magic, version) combination: %08x, %08x; is this really a GGML file?", + magic, version); } void read_hparams() { hparams.n_vocab = file.read_u32(); @@ -2290,7 +2294,7 @@ int llama_apply_lora_from_file_internal(struct llama_context * ctx, const char * { uint32_t magic; fin.read((char *) &magic, sizeof(magic)); - if (magic != 'ggla') { + if (magic != LLAMA_FILE_MAGIC_GGLA) { fprintf(stderr, "%s: bad file magic\n", __func__); return 1; } diff --git a/llama.h b/llama.h index 0a63d034b..37bae5357 100644 --- a/llama.h +++ b/llama.h @@ -19,10 +19,16 @@ # define LLAMA_API #endif +#define LLAMA_FILE_MAGIC_GGJT 0x67676a74u // 'ggjt' +#define LLAMA_FILE_MAGIC_GGLA 0x67676c61u // 'ggla' +#define LLAMA_FILE_MAGIC_GGMF 0x67676d66u // 'ggmf' +#define LLAMA_FILE_MAGIC_GGML 0x67676d6cu // 'ggml' +#define LLAMA_FILE_MAGIC_GGSN 0x6767736eu // 'ggsn' + #define LLAMA_FILE_VERSION 3 -#define LLAMA_FILE_MAGIC 'ggjt' -#define LLAMA_FILE_MAGIC_UNVERSIONED 'ggml' -#define LLAMA_SESSION_MAGIC 'ggsn' +#define LLAMA_FILE_MAGIC LLAMA_FILE_MAGIC_GGJT +#define LLAMA_FILE_MAGIC_UNVERSIONED LLAMA_FILE_MAGIC_GGML +#define LLAMA_SESSION_MAGIC LLAMA_FILE_MAGIC_GGSN #define LLAMA_SESSION_VERSION 1 #ifdef __cplusplus