Size: a a a

Compiler Development

2021 February 11

AT

Alexander Tchitchigi... in Compiler Development
Peter Sovietov
Это мой личный список, оформлю и дам ссылку на днях :)
👌
источник
2021 February 12

LA

Liber Azerate in Compiler Development
Как обычно реализуется break? Вопрос в том, что чтобы куда-то прыгнуть, нужно знать basic block. Поэтому инструкции циклов я сделал так, что инициализируются сначала пустые инструкции с basic block'ами, сохраняется в статическую переменную текущая, и таким образом break имеет доступ сразу к нужному bb. Однако, внезапно, оказалось, что вложенные инструкции при этом превращаются в кашу. Если бы bb генерировались во время самой компиляции, такой проблемы не было бы, однако была бы с брейком. Ходить по bb, конечно, можно, и мне кажется, последний bb функции в данном случае всегда будет нужным, однако такое впечатление, что я вообще сделал что-то не то и может есть как это обычно делается? Да и continue так, пожалуй, не сделаешь
источник

AK

Andrei Kurosh in Compiler Development
Liber Azerate
Как обычно реализуется break? Вопрос в том, что чтобы куда-то прыгнуть, нужно знать basic block. Поэтому инструкции циклов я сделал так, что инициализируются сначала пустые инструкции с basic block'ами, сохраняется в статическую переменную текущая, и таким образом break имеет доступ сразу к нужному bb. Однако, внезапно, оказалось, что вложенные инструкции при этом превращаются в кашу. Если бы bb генерировались во время самой компиляции, такой проблемы не было бы, однако была бы с брейком. Ходить по bb, конечно, можно, и мне кажется, последний bb функции в данном случае всегда будет нужным, однако такое впечатление, что я вообще сделал что-то не то и может есть как это обычно делается? Да и continue так, пожалуй, не сделаешь
Continue можно генерировать сразу, тк расположение начала блока уже известно. Break чуть сложнее - сначала по ходу генерации кода вставляются заглушки и запоминаются их расположения, а когда весь оставшийся код блока скомпилирован - проходятся по заглушкам и заменяют их на переход к фактическому адресу конца блока
источник

LA

Liber Azerate in Compiler Development
Andrei Kurosh
Continue можно генерировать сразу, тк расположение начала блока уже известно. Break чуть сложнее - сначала по ходу генерации кода вставляются заглушки и запоминаются их расположения, а когда весь оставшийся код блока скомпилирован - проходятся по заглушкам и заменяют их на переход к фактическому адресу конца блока
Ну, continue это так, у меня его нет. Что имеется в виду под заглушками? Потому что как-то получается, что это не может быть что-то кроме bb, ведь я не могу вставить bb до уже сгенерированного ранее. Ну или я не освоил технологию(использую LLVM API). Ну а если это bb, то получается то же, что я описал выше
источник

AK

Andrei Kurosh in Compiler Development
Как это делается конкретно в LLVM - не знаю. Под «заглушками» я имел в виду любую инструкцию, равную по размеру инструкции перехода - например, nop?
источник

AK

Andrei Kurosh in Compiler Development
Или просто jmp на нулевой адрес, который потом заменится на нормальный
источник

s

suhr in Compiler Development
Вы в один проход компилируете?
источник

K

Kir in Compiler Development
Andrei Kurosh
Как это делается конкретно в LLVM - не знаю. Под «заглушками» я имел в виду любую инструкцию, равную по размеру инструкции перехода - например, nop?
nop = xor eax, eax же однобайтовый, не?
источник

LA

Liber Azerate in Compiler Development
Andrei Kurosh
Как это делается конкретно в LLVM - не знаю. Под «заглушками» я имел в виду любую инструкцию, равную по размеру инструкции перехода - например, nop?
Спасибо, понял. Попробую сделать что-то такое
источник

LA

Liber Azerate in Compiler Development
suhr
Вы в один проход компилируете?
Если это ко мне было, то да
источник

AT

Alexander Tchitchigi... in Compiler Development
Kir
nop = xor eax, eax же однобайтовый, не?

nop nop
nop nop nop

😂
источник

LA

Liber Azerate in Compiler Development
Andrei Kurosh
Или просто jmp на нулевой адрес, который потом заменится на нормальный
До меня дошло, спасибо!
источник

S

Stefan in Compiler Development
Kir
nop = xor eax, eax же однобайтовый, не?
no
источник

S

Stefan in Compiler Development
xor eax eax still did something
источник

S

Stefan in Compiler Development
it erases the content of eax
источник

S

Stefan in Compiler Development
in expression terms, this is equivalent to eax = eax ^ eax <=> eax = 0
источник

S

Stefan in Compiler Development
so its not exactly nop
источник

AS

Artem Shishkin in Compiler Development
Kir
nop = xor eax, eax же однобайтовый, не?
xchg eax, eax
источник

K

Kir in Compiler Development
Artem Shishkin
xchg eax, eax
Точно!
источник

AS

Artem Shishkin in Compiler Development
И то, это байки из склепа. Когда-то по таблице опкодов просто был логически
источник