Lenny Komow | 3e745d7 | 2017-06-08 16:41:02 -0600 | [diff] [blame] | 1 | /* |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 2 | * Copyright (c) 2017-2018 The Khronos Group Inc. |
| 3 | * Copyright (c) 2017-2018 Valve Corporation |
| 4 | * Copyright (c) 2017-2018 LunarG, Inc. |
Lenny Komow | 3e745d7 | 2017-06-08 16:41:02 -0600 | [diff] [blame] | 5 | * |
| 6 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 7 | * you may not use this file except in compliance with the License. |
| 8 | * You may obtain a copy of the License at |
| 9 | * |
| 10 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | * |
| 12 | * Unless required by applicable law or agreed to in writing, software |
| 13 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 15 | * See the License for the specific language governing permissions and |
| 16 | * limitations under the License. |
| 17 | * |
| 18 | * Author: Lenny Komow <lenny@lunarg.com> |
| 19 | */ |
| 20 | |
| 21 | // This code generates an assembly file which provides offsets to get struct members from assembly code. |
| 22 | |
| 23 | #include <stdio.h> |
| 24 | #include "loader.h" |
| 25 | |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 26 | #if !defined(_MSC_VER) || (_MSC_VER >= 1900) |
| 27 | #define SIZE_T_FMT "%-8zu" |
| 28 | #else |
| 29 | #define SIZE_T_FMT "%-8lu" |
| 30 | #endif |
| 31 | |
| 32 | struct ValueInfo |
| 33 | { |
| 34 | const char *name; |
| 35 | size_t value; |
| 36 | const char *comment; |
| 37 | }; |
| 38 | |
Lenny Komow | 3e745d7 | 2017-06-08 16:41:02 -0600 | [diff] [blame] | 39 | int main(int argc, char **argv) { |
| 40 | const char *assembler = NULL; |
| 41 | for (int i = 0; i < argc; ++i) { |
| 42 | if (!strcmp(argv[i], "MASM")) { |
| 43 | assembler = "MASM"; |
Lenny Komow | 007319b | 2017-06-09 15:21:06 -0600 | [diff] [blame] | 44 | } else if (!strcmp(argv[i], "GAS")) { |
| 45 | assembler = "GAS"; |
Lenny Komow | 3e745d7 | 2017-06-08 16:41:02 -0600 | [diff] [blame] | 46 | } |
| 47 | } |
| 48 | if (assembler == NULL) { |
| 49 | return 1; |
| 50 | } |
| 51 | |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 52 | struct ValueInfo values[] = { |
| 53 | { .name = "VK_DEBUG_REPORT_ERROR_BIT_EXT", .value = (size_t) VK_DEBUG_REPORT_ERROR_BIT_EXT, |
| 54 | .comment = "The numerical value of the enum value 'VK_DEBUG_REPORT_ERROR_BIT_EXT'" }, |
| 55 | { .name = "PTR_SIZE", .value = sizeof(void*), |
| 56 | .comment = "The size of a pointer" }, |
| 57 | { .name = "HASH_SIZE", .value = sizeof(struct loader_dispatch_hash_entry), |
| 58 | .comment = "The size of a 'loader_dispatch_hash_entry' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 59 | { .name = "HASH_OFFSET_INSTANCE", .value = offsetof(struct loader_instance, phys_dev_ext_disp_hash), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 60 | .comment = "The offset of 'phys_dev_ext_disp_hash' within a 'loader_instance' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 61 | { .name = "PHYS_DEV_OFFSET_INST_DISPATCH", .value = offsetof(struct loader_instance_dispatch_table, phys_dev_ext), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 62 | .comment = "The offset of 'phys_dev_ext' within in 'loader_instance_dispatch_table' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 63 | { .name = "PHYS_DEV_OFFSET_PHYS_DEV_TRAMP", .value = offsetof(struct loader_physical_device_tramp, phys_dev), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 64 | .comment = "The offset of 'phys_dev' within a 'loader_physical_device_tramp' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 65 | { .name = "ICD_TERM_OFFSET_PHYS_DEV_TERM", .value = offsetof(struct loader_physical_device_term, this_icd_term), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 66 | .comment = "The offset of 'this_icd_term' within a 'loader_physical_device_term' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 67 | { .name = "PHYS_DEV_OFFSET_PHYS_DEV_TERM", .value = offsetof(struct loader_physical_device_term, phys_dev), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 68 | .comment = "The offset of 'phys_dev' within a 'loader_physical_device_term' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 69 | { .name = "INSTANCE_OFFSET_ICD_TERM", .value = offsetof(struct loader_icd_term, this_instance), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 70 | .comment = "The offset of 'this_instance' within a 'loader_icd_term' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 71 | { .name = "DISPATCH_OFFSET_ICD_TERM", .value = offsetof(struct loader_icd_term, phys_dev_ext), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 72 | .comment = "The offset of 'phys_dev_ext' within a 'loader_icd_term' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 73 | { .name = "FUNC_NAME_OFFSET_HASH", .value = offsetof(struct loader_dispatch_hash_entry, func_name), |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 74 | .comment = "The offset of 'func_name' within a 'loader_dispatch_hash_entry' struct" }, |
Lenny Komow | f220ce6 | 2018-03-28 14:31:32 -0600 | [diff] [blame] | 75 | { .name = "EXT_OFFSET_DEVICE_DISPATCH", .value = offsetof(struct loader_dev_dispatch_table, ext_dispatch), |
Lenny Komow | 7e669d9 | 2017-06-29 15:26:20 -0600 | [diff] [blame] | 76 | .comment = "The offset of 'ext_dispatch' within a 'loader_dev_dispatch_table' struct" }, |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 77 | }; |
Lenny Komow | 3e745d7 | 2017-06-08 16:41:02 -0600 | [diff] [blame] | 78 | |
| 79 | FILE *file = fopen("gen_defines.asm", "w"); |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 80 | fprintf(file, "\n"); |
Lenny Komow | 3e745d7 | 2017-06-08 16:41:02 -0600 | [diff] [blame] | 81 | if (!strcmp(assembler, "MASM")) { |
Lenny Komow | 30c1b8a | 2017-06-16 16:42:46 -0600 | [diff] [blame] | 82 | for (size_t i = 0; i < sizeof(values)/sizeof(values[0]); ++i) { |
| 83 | fprintf(file, "%-32s equ " SIZE_T_FMT "; %s\n", values[i].name, values[i].value, values[i].comment); |
| 84 | } |
Lenny Komow | 007319b | 2017-06-09 15:21:06 -0600 | [diff] [blame] | 85 | } else if (!strcmp(assembler, "GAS")) { |
Lenny Komow | 007319b | 2017-06-09 15:21:06 -0600 | [diff] [blame] | 86 | #ifdef __x86_64__ |
| 87 | fprintf(file, ".set X86_64, 1\n"); |
| 88 | #endif // __x86_64__ |
Lenny Komow | d3919b0 | 2017-06-29 11:11:16 -0600 | [diff] [blame] | 89 | for (size_t i = 0; i < sizeof(values)/sizeof(values[0]); ++i) { |
| 90 | fprintf(file, ".set %-32s, " SIZE_T_FMT "# %s\n", values[i].name, values[i].value, values[i].comment); |
| 91 | } |
Lenny Komow | 3e745d7 | 2017-06-08 16:41:02 -0600 | [diff] [blame] | 92 | } |
| 93 | return fclose(file); |
| 94 | } |