Я знаю, что 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 исчерпает регистры (поскольку в целевой архитектуре только ограниченное количество регистров)?