Как предотвратить компиляцию локальных переменных clang / llvm в глобальные?

У меня есть код на C:

int64_t sample_max(int64_t *beg, int64_t len) {
    if (len == 0) {
        return 0;
    }
    int64_t max = 0x8000000000000000;
    int64_t *end = beg + len;
    while (beg < end) {
        if (*beg > max) {
            max = *beg;
        }
        beg++;
    }
    return max;
}

и выполните его лязгом:

clang -S -target x86_64-unknown-none -masm=intel -mno-red-zone -mstackrealign -mllvm -inline-threshold=1000 -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -O3 -fno-builtin -ffast-math -mavx2 lib/sample.c -o lib/sample_avx2.s

и я обнаружил, что clang / llvm соответствует глобальным локальным переменным «max = 0x8000000000000000»:

vpbroadcastq    ymm0, qword ptr [rip + .LCPI1_0]
    vmovdqa ymm3, ymm0
    vmovdqa ymm2, ymm0
    vmovdqa ymm1, ymm0

....

.LCPI1_0:
    .quad   -9223372036854775808    # 0x8000000000000000
    .section    .rodata,"a",@progbits
    .align  32

Как предотвратить компиляцию локальных переменных clang / llvm в глобальные? Можем ли мы скомпилировать 0x8000000000000000 с немедленными значениями?

Спасибо.

Зачем тебе это нужно? А какой именно asm вы ожидаете? Какой-то movabsq, за которым следует переход в регистр XMM (возможно, через память в зависимости от точной цели) и, наконец, трансляция?

Marc Glisse 02.05.2018 08:47

Локальные переменные не являются глобальными. Компилятор использует для них регистры. Он хранит 0x8000000000000000 с фактически статической продолжительностью хранения. 0x8000000000000000 - это константа, а не переменная. Компилятор может реализовать это по своему усмотрению. Что вас беспокоит по поводу того, как он хранится - почему вас это волнует, как это влияет на вас?

Eric Postpischil 02.05.2018 13:05

@MarcGlisse @Eric Postpischil Я хочу преобразовать эти asm в go-asm с помощью c2goasm. И встречаю вопрос github.com/minio/c2goasm/issues/8

NealHu 02.05.2018 13:11

@EricPostpischil Я хочу преобразовать эти asm в go-asm с помощью c2goasm. И я столкнулся с проблемой github.com/minio/c2goasm/issues/8

NealHu 02.05.2018 13:14

Скомпилируйте с использованием флага -Os. Это остановит создание глобальных таблиц переходов. Протестировано с помощью clang 3.8

ConsistentProgrammer 02.05.2018 14:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
164
0

Другие вопросы по теме