Загрузка / сохранение структур по значению в LLVM - PullRequest
0 голосов
/ 16 июня 2019

Я знаю, что clang использует sret и byval для возврата или передачи параметров структуры соответственно (или принудительно их, если они очень маленькие) и memcpy для назначения / копирования их следующим образом:

%struct.X = type { i32, i32, i32, i32 }
%struct.Y = type { %struct.X, i32 }

define void @foo(%struct.X* noalias sret, %struct.X* byval align 8) 

Могу ли я также передать / вернуть их напрямую, как это?

define %struct.X @foo(%struct.X align 8) 

Что если я хочу скопировать / назначить структуру?Могу ли я использовать load / store регулярно, как я бы делал со скалярными значениями?

%0 = load %struct.Y, %struct.Y* %a
store %struct.Y %0, %struct.Y* %b

Если так, что происходит, когда структуры очень большие?Может ли случиться так, что LLVM исчерпает регистры (поскольку в целевой архитектуре только ограниченное количество регистров)?

...