LINUX.ORG.RU

Загадки исходников NVIDIA

 , ,


0

2

Имеется исходник:

https://github.com/NVIDIA/open-gpu-kernel-modules/blob/main/src/nvidia/genera...

И в нем не понятно, что это за конструкция в виде отдельного блока, завершаемого запятой «{...},» посреди других определений:

#if defined(BINDATA_INCLUDE_STORAGE_PVT_DECL)
BINDATA_STORAGE_PVT kgspBinArchiveBooterLoadUcode_TU102_patch_meta_storage_pvt;
#endif // defined(BINDATA_INCLUDE_STORAGE_PVT_DECL)

#if defined(BINDATA_INCLUDE_STORAGE_PVT_DEFN)
{
    12, // uncompressed data size (bytes)
    12, // compressed data size (bytes)
    kgspBinArchiveBooterLoadUcode_TU102_patch_meta_data, // compressed data pointer
    NV_FALSE, // is pData compressed?
    NV_TRUE, // contain information for file overriding?
    NV_FALSE, // is the data referenced during load? (Only valid when BINDATA_IS_MUTABLE is true)
},
#endif // defined(BINDATA_INCLUDE_STORAGE_PVT_DEFN)

#if defined(BINDATA_INCLUDE_DATA)
static BINDATA_CONST NvU8 kgspBinArchiveBooterLoadUcode_TU102_num_sigs_data[] = 
{
    0x01, 0x00, 0x00, 0x00,
};
#endif // defined(BINDATA_INCLUDE_DATA)

Эта конструкция «{...},» ничему не присваивается, то есть не участвует в инициализации, зачем она нужна? Встречается в этом файле несколько раз.

★★★★★

Загадки

Да не, тут только загадка свиного рыла и калашного ряда чьей-то необразованности.

#ifdef-директивы, в которые обёрнуты разные части файла, ни на что не намекают? (Подсказка: файл включается несколько раз, с разными переменными препроцессора.)

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Да не, тут только загадка свиного рыла и калашного ряда чьей-то необразованности.

Ущербный бедолага. Твоя свинская натура не дает тебе покоя, а свербление в заднице вынуждает высерать словесный помет в технических темах.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от XMs

Чтобы закрыть тему как решенную, давай напишем здесь что ты понял. Значит, анонимус дал ссылку на кусок кода:

typedef struct
{
    NvU32           actualSize;         // size of (uncompressed) pData
    NvU32           compressedSize;     // size of (compressed) pData array
    const void *    pData;              // pointer to the raw binary (whether compressed or not) data
    NvBool          bCompressed            : 1;    // is compressed?
    NvBool          bFileOverrideSupported : 1;    // contain information for file overriding?
    NvBool          bReferenced            : 1;    // Has this data been referenced before?
} BINDATA_STORAGE_PVT, *PBINDATA_STORAGE_PVT;

Ну хорошо, мы увидели что из себя представляет тип BINDATA_STORAGE_PVT. Почему имя типа оформлено как дефайн - непонятно, но будем считать что это таки тип.

Значит, в следующем коде просто определяется переменная kgspBinArchiveBooterLoadUcode_TU102_patch_meta_storage_pvt типа BINDATA_STORAGE_PVT, не более того:
#if defined(BINDATA_INCLUDE_STORAGE_PVT_DECL)
BINDATA_STORAGE_PVT kgspBinArchiveBooterLoadUcode_TU102_patch_meta_storage_pvt;
#endif // defined(BINDATA_INCLUDE_STORAGE_PVT_DECL)

А после этого кода идет наша загадочная конструкция:
#if defined(BINDATA_INCLUDE_STORAGE_PVT_DEFN)
{
    12, // uncompressed data size (bytes)
    12, // compressed data size (bytes)
    kgspBinArchiveBooterLoadUcode_TU102_patch_meta_data, // compressed data pointer
    NV_FALSE, // is pData compressed?
    NV_TRUE, // contain information for file overriding?
    NV_FALSE, // is the data referenced during load? (Only valid when BINDATA_IS_MUTABLE is true)
},
#endif // defined(BINDATA_INCLUDE_STORAGE_PVT_DEFN)

И что с того? Что из этих исходных данных ты понял?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Как правильно написал intelfx, там большую роль играют директивы препроцессора, а Ivan_qrt ещё и приложил ссылку на место, где этот файл инклюдится с пачкой других. Признаюсь честно, я не знаю, во что при правильном наборе макросов это должно вылиться (и какой это набор макросов) — не стал разбираться — но очевидно, при при правильной магии дефайнов это превращается во что-то осмысленное, скорее всего в заполнение полей какой-то структуры

XMs ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Да что же вы все не туда тыкаете?

Правильно будет вот это:

https://github.com/NVIDIA/open-gpu-kernel-modules/blob/caa2dd11a0db42e5d6130f...

То есть, имеется код:

BINDATA_CONST struct BINDATA_STORAGE_PVT_ALL g_bindata_pvt =
{
#define BINDATA_NO_SEGMENTS
#define BINDATA_INCLUDE_STORAGE_PVT_DEFN
...
#include "g_bindata_kgspGetBinArchiveBooterLoadUcode_TU102.c"
...
#undef BINDATA_INCLUDE_STORAGE_PVT_DEFN
#undef BINDATA_NO_SEGMENTS
};

Получается что при существующем дефайне BINDATA_INCLUDE_STORAGE_PVT_DEFN в файле g_bindata_kgspGetBinArchiveBooterLoadUcode_TU102.c останутся строки с частями структуры. И поэтому конструкции «{...},» становятся оправданы.

То есть, виртуозы из NVIDIA один раз включают файл с дефайнами, генерирующими обычные определения, а второй раз включают тот же самый файл с дефайнами, которые генерируют содержимое внутри определения структуры.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Чтобы закрыть тему как решенную, давай

вспомним, что на предыдущем допросе Вы признались, что не программируете на C/C++. А теперь Вас поймали за чтением исходников драйверов. Как Вы это объясните? Но помните, что любое слово может быть обращено против Вас!

anonymous
()
Ответ на: комментарий от Xintrea

То есть, виртуозы из NVIDIA один раз включают файл с дефайнами, генерирующими обычные определения, а второй раз включают тот же самый файл с дефайнами, которые генерируют содержимое внутри определения структуры.

Множественные инклуды файлов с заданием дефайнов перед ними - один из трюков. Не частый, но попадается. Например, STC 4.2 - библиотека алгоритмов и контейнеров для Си активно использует такое.

AlexVR ★★★★★
()
Ответ на: комментарий от Xintrea

То есть, виртуозы из NVIDIA один раз включают файл с дефайнами, генерирующими обычные определения, а второй раз включают тот же самый файл с дефайнами, которые генерируют содержимое внутри определения структуры.

И - инкапсуляция.

Считаю, что за такой код надо кастрировать.

her_s_gory
()