Coverage Report

Created: 2025-11-28 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/llama.cpp/src/llama-impl.cpp
Line
Count
Source
1
#include "llama-impl.h"
2
3
#include "gguf.h"
4
#include "llama.h"
5
6
#include <cinttypes>
7
#include <climits>
8
#include <cstdarg>
9
#include <cstring>
10
#include <vector>
11
#include <sstream>
12
13
struct llama_logger_state {
14
    ggml_log_callback log_callback = llama_log_callback_default;
15
    void * log_callback_user_data = nullptr;
16
};
17
18
static llama_logger_state g_logger_state;
19
20
1.54k
time_meas::time_meas(int64_t & t_acc, bool disable) : t_start_us(disable ? -1 : ggml_time_us()), t_acc(t_acc) {}
21
22
1.44k
time_meas::~time_meas() {
23
1.44k
    if (t_start_us >= 0) {
24
1.44k
        t_acc += ggml_time_us() - t_start_us;
25
1.44k
    }
26
1.44k
}
27
28
0
void llama_log_set(ggml_log_callback log_callback, void * user_data) {
29
0
    ggml_log_set(log_callback, user_data);
30
0
    g_logger_state.log_callback = log_callback ? log_callback : llama_log_callback_default;
31
0
    g_logger_state.log_callback_user_data = user_data;
32
0
}
33
34
6.35k
static void llama_log_internal_v(ggml_log_level level, const char * format, va_list args) {
35
6.35k
    va_list args_copy;
36
6.35k
    va_copy(args_copy, args);
37
6.35k
    char buffer[128];
38
6.35k
    int len = vsnprintf(buffer, 128, format, args);
39
6.35k
    if (len < 128) {
40
6.24k
        g_logger_state.log_callback(level, buffer, g_logger_state.log_callback_user_data);
41
6.24k
    } else {
42
111
        char * buffer2 = new char[len + 1];
43
111
        vsnprintf(buffer2, len + 1, format, args_copy);
44
111
        buffer2[len] = 0;
45
111
        g_logger_state.log_callback(level, buffer2, g_logger_state.log_callback_user_data);
46
111
        delete[] buffer2;
47
111
    }
48
6.35k
    va_end(args_copy);
49
6.35k
}
50
51
6.35k
void llama_log_internal(ggml_log_level level, const char * format, ...) {
52
6.35k
    va_list args;
53
6.35k
    va_start(args, format);
54
6.35k
    llama_log_internal_v(level, format, args);
55
6.35k
    va_end(args);
56
6.35k
}
57
58
6.35k
void llama_log_callback_default(ggml_log_level level, const char * text, void * user_data) {
59
6.35k
    (void) level;
60
6.35k
    (void) user_data;
61
6.35k
    fputs(text, stderr);
62
6.35k
    fflush(stderr);
63
6.35k
}
64
65
2.16k
void replace_all(std::string & s, const std::string & search, const std::string & replace) {
66
2.16k
    if (search.empty()) {
67
0
        return;
68
0
    }
69
2.16k
    std::string builder;
70
2.16k
    builder.reserve(s.length());
71
2.16k
    size_t pos = 0;
72
2.16k
    size_t last_pos = 0;
73
2.33k
    while ((pos = s.find(search, last_pos)) != std::string::npos) {
74
170
        builder.append(s, last_pos, pos - last_pos);
75
170
        builder.append(replace);
76
170
        last_pos = pos + search.length();
77
170
    }
78
2.16k
    builder.append(s, last_pos, std::string::npos);
79
2.16k
    s = std::move(builder);
80
2.16k
}
81
82
2.77k
std::string format(const char * fmt, ...) {
83
2.77k
    va_list ap;
84
2.77k
    va_list ap2;
85
2.77k
    va_start(ap, fmt);
86
2.77k
    va_copy(ap2, ap);
87
2.77k
    int size = vsnprintf(NULL, 0, fmt, ap);
88
2.77k
    GGML_ASSERT(size >= 0 && size < INT_MAX); // NOLINT
89
2.77k
    std::vector<char> buf(size + 1);
90
2.77k
    int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2);
91
2.77k
    GGML_ASSERT(size2 == size);
92
2.77k
    va_end(ap2);
93
2.77k
    va_end(ap);
94
2.77k
    return std::string(buf.data(), size);
95
2.77k
}
96
97
0
std::string llama_format_tensor_shape(const std::vector<int64_t> & ne) {
98
0
    char buf[256];
99
0
    snprintf(buf, sizeof(buf), "%5" PRId64, ne.at(0));
100
0
    for (size_t i = 1; i < ne.size(); i++) {
101
0
        snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ", %5" PRId64, ne.at(i));
102
0
    }
103
0
    return buf;
104
0
}
105
106
0
std::string llama_format_tensor_shape(const struct ggml_tensor * t) {
107
0
    char buf[256];
108
0
    snprintf(buf, sizeof(buf), "%5" PRId64, t->ne[0]);
109
0
    for (int i = 1; i < GGML_MAX_DIMS; i++) {
110
0
        snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ", %5" PRId64, t->ne[i]);
111
0
    }
112
0
    return buf;
113
0
}
114
115
6.53k
static std::string gguf_data_to_str(enum gguf_type type, const void * data, int i) {
116
6.53k
    switch (type) {
117
719
        case GGUF_TYPE_UINT8:   return std::to_string(((const uint8_t  *)data)[i]);
118
598
        case GGUF_TYPE_INT8:    return std::to_string(((const int8_t   *)data)[i]);
119
686
        case GGUF_TYPE_UINT16:  return std::to_string(((const uint16_t *)data)[i]);
120
730
        case GGUF_TYPE_INT16:   return std::to_string(((const int16_t  *)data)[i]);
121
351
        case GGUF_TYPE_UINT32:  return std::to_string(((const uint32_t *)data)[i]);
122
267
        case GGUF_TYPE_INT32:   return std::to_string(((const int32_t  *)data)[i]);
123
379
        case GGUF_TYPE_UINT64:  return std::to_string(((const uint64_t *)data)[i]);
124
433
        case GGUF_TYPE_INT64:   return std::to_string(((const int64_t  *)data)[i]);
125
497
        case GGUF_TYPE_FLOAT32: return std::to_string(((const float    *)data)[i]);
126
298
        case GGUF_TYPE_FLOAT64: return std::to_string(((const double   *)data)[i]);
127
1.57k
        case GGUF_TYPE_BOOL:    return ((const bool *)data)[i] ? "true" : "false";
128
0
        default:                return format("unknown type %d", type);
129
6.53k
    }
130
6.53k
}
131
132
2.21k
std::string gguf_kv_to_str(const struct gguf_context * ctx_gguf, int i) {
133
2.21k
    const enum gguf_type type = gguf_get_kv_type(ctx_gguf, i);
134
135
2.21k
    switch (type) {
136
262
        case GGUF_TYPE_STRING:
137
262
            return gguf_get_val_str(ctx_gguf, i);
138
327
        case GGUF_TYPE_ARRAY:
139
327
            {
140
327
                const enum gguf_type arr_type = gguf_get_arr_type(ctx_gguf, i);
141
327
                int arr_n = gguf_get_arr_n(ctx_gguf, i);
142
327
                const void * data = arr_type == GGUF_TYPE_STRING ? nullptr : gguf_get_arr_data(ctx_gguf, i);
143
327
                std::stringstream ss;
144
327
                ss << "[";
145
5.41k
                for (int j = 0; j < arr_n; j++) {
146
5.08k
                    if (arr_type == GGUF_TYPE_STRING) {
147
181
                        std::string val = gguf_get_arr_str(ctx_gguf, i, j);
148
                        // escape quotes
149
181
                        replace_all(val, "\\", "\\\\");
150
181
                        replace_all(val, "\"", "\\\"");
151
181
                        ss << '"' << val << '"';
152
4.90k
                    } else if (arr_type == GGUF_TYPE_ARRAY) {
153
0
                        ss << "???";
154
4.90k
                    } else {
155
4.90k
                        ss << gguf_data_to_str(arr_type, data, j);
156
4.90k
                    }
157
5.08k
                    if (j < arr_n - 1) {
158
4.76k
                        ss << ", ";
159
4.76k
                    }
160
5.08k
                }
161
327
                ss << "]";
162
327
                return ss.str();
163
0
            }
164
1.62k
        default:
165
1.62k
            return gguf_data_to_str(type, gguf_get_val_data(ctx_gguf, i), 0);
166
2.21k
    }
167
2.21k
}