2. LLVM Language Reference Manual - identifiers (shortened) (1157487)
Текст из файла
ОГЛАВЛЕНИЕИдентификаторы ................................................................................................. 2Структура модуля ............................................................................................... 2Типы данных........................................................................................................ 3First Class Types ............................................................................................... 3Single Value Types ....................................................................................... 3Integer Type ..................................................................................................
3Floating Point Types ..................................................................................... 4Pointer Type .................................................................................................. 4Aggregate Types ........................................................................................... 4Array Type ................................................................................................ 4Structure Type ........................................................................................... 4Инструкции ..........................................................................................................
5terminator instructions: ..................................................................................... 5binary instructions ............................................................................................. 5bitwise binary instructions ................................................................................ 6memory instructions..........................................................................................
6alloca ............................................................................................................. 6load ................................................................................................................ 6store ...........................................................................................................
6other instructions ............................................................................................... 8„icmp„ ............................................................................................................ 8„phi„ ............................................................................................................... 9'call'................................................................................................................ 9conversion operations .......................................................................................
9'sext' ............................................................................................................... 9Полное описание доступно по ссылке http://llvm.org/docs/LangRef.html.ИДЕНТИФИКАТОРЫ- бывают глобальные и локальные. Имена глобальных (функции,глобальные переменные) начинаются с символа „@‟. Локальные (именарегистров, типы ) начинаются с „%‟.Пример:%foo, @DivisionByZero, %a.really.long.identifier.Комментарии начинаются с „;‟ и идут до конца строки%0 = add i32 %X, %X; yields i32:%0%1 = add i32 %0, %0; yields i32:%1%result = add i32 %1, %1СТРУКТУРА МОДУЛЯLLVM программы состоят из модулей, которые соответствуют единицамтрансляции.Каждый модуль состоит из функций, глобальныхпеременных и таблицы символов. Модули могут быть связаны междусобой с помощью компоновщика.Пример:; Declare the string constant as a global constant.@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"; External declaration of the puts functiondeclare i32 @puts(i8* nocapture) nounwind; Definition of main functiondefine i32 @main() { ; i32()*; Convert [13 x i8]* to i8 *...%cast210 = getelementptr [13 x i8]* @.str, i64 0, i64 0; Call puts function to write out the string to stdout.call i32 @puts(i8* %cast210)ret i32 0}; Named metadata!0 = metadata !{i32 42, null, metadata !"string"}!foo = !{!0}В приведенном примере переменная “.str” объявлена как глобальная,функция “puts” внешняя, определены “main” и метаданные “foo”.
Вобщем случае глобальные переменные представлены как указатель, внашем примере как указатель на массив символов и указатель нафункцию.ТИПЫ ДАННЫХVoid - аналог типа void в С/С++Синтаксис:voidFunction TypeФункциональный тип соответствует сигнатуре функции и состоит из типавозвращаемого значения, и списка типов формальных параметров.Синтаксис:<тип возвращаемого значения> (<список параметров>)Пример:i32 (i32)функция принимающая i32, возвращающая i32float (i16, i32 *) * Указатель на функцию, принимающую i16 и указательна i32, возвращающую float.First Class TypesИнструкции могут вернуть только значения этих типов.Single Value TypesТипы, которым будут соответствовать типам регистров целевой машины,при генерации кода.Integer TypeЦелочисленные типы, простой тип который указывает количество битотводимое для хранение значения.
Диапазон от 1 бита до 223-1.Синтаксис:iNN – число бит.Examples:i11 битное целое.i32 32 битное целое.i1942652 1942652 битное целое.Floating Point Typeshalf 16-битное число с плавающей точкойfloat 32- битное число с плавающей точкойdouble64- битное число с плавающей точкойfp128 128- битное число с плавающей точкой (112-битная мантиса)x86_fp80 80- битное число с плавающей точкой (X87)Pointer TypeLLVM не поддерживает указатель на void (void*) , вместо этогоиспользуется i8*.Синтаксис:<type> *Пример:[4 x i32]* Указатель на массив из четырех i32.i32 (i32*) * Указатель на функцию, принимающую i32* и возвращающуюi32.Aggregate TypesArray TypeСлужит для описания массивовСинтаксис:[<# количество элементов> x <тип элементов>]Примеры:[40 x i32] Массив из 40 32-битных целых.[41 x i32] Массив из 41 32-битного целого.[4 x i8]Массив из 4 8-битных целых.[3 x [4 x i32]]массив 3x4 содержащий 32- битных целых.Structure TypeДоступ к элементам структур в памяти осуществляется с использованиеминструкций„load„ and „store„ по указателю на поле полученному спомощью инструкции „getelementptr„.
Доступ к структурам в регистрахосуществляется с использованием инструкций „extractvalue„ и „insertvalue„.Синтаксис:%T1 = type { <список типов> } ; описывает обычную структуру%T2 = type <{ <список типов > }> ; описывает «packed» структуру –элементы следуют непосредственно друг за другом без выравниванияэлементов в памяти, ее размер равен сумме размеров членов структуры.Пример:{ i32, i32, i32 } Три i32 значения.{ float, i32 (i32) * }«Пара» (кортеж из двух элементов) где первыйэлемент float и второй указатель на функцию, принимающую i32, ивозвращающую i32.<{ i8, i32 }>„packed‟ структура, с размером в 5 байтИНСТРУКЦИИterminator instructions:Каждый базовый блок должен заканчиваться инструкцией класса“Terminator” , показывающей, что должно быть выполнено послезавершения базового блока.
Таких инструкций немного:„ret„, „br„, „switch„, „indirectbr„, „invoke„, „resume„, and „unreachable„.ret – аналог оператора return в C/C++Пример:ret i32 5ret voidbr – инструкция передачи управленияbr i1 <условие>, label <условие истинно>, label <условие ложно>br label <dest>; Unconditional branchпример:Test:%cond = icmp eq i32 %a, %bbr i1 %cond, label %IfEqual, label %IfUnequalIfEqual:ret i32 1IfUnequal:ret i32 0binary instructionsПринимают два аргумента и возвращают значение, примерами могутслужить add, sub, mul, div.Синтаксис:<result> = add <ty> <op1>, <op2><result> = add nuw <ty> <op1>, <op2><result> = add nsw <ty> <op1>, <op2><result> = add nuw nsw <ty> <op1>, <op2><result> = add i32 4, %var; i32:result = 4 + %varЕслиоперация вызвала беззнаковое переполнение, возвращаемоезначение будет равно 2n, где n ширина результата в битах.nuw и nsw сокращения от “No Unsigned Wrap” и “No Signed Wrap”.
Еслиэти ключевые слова присутствуют, то при переполнении в качестверезультирующего значения будет использовано специальное значение“poison value” (см. http://llvm.org/docs/LangRef.html#poisonvalues)bitwise binary instructionsнапример: and,or, xor;memory instructionsallocaинструкция „alloca„ выделяет память на стеке текущей функции,<результат> = alloca [inalloca] <тип_выделяемой_памяти> [, <тип> <числоэлементов>] [, align <выравнивание>]Инструкция „alloca„ выделяет sizeof(<тип>)*КоличествоЭлементов байтна стеке текущей функции, возвращает указатель на выделенную память.Память будет освобождена при возврате управления из этой функции.Пример:%ptr = alloca i32%ptr = alloca i32, i32 4%ptr = alloca i32, i32 4, align 1024%ptr = alloca i32, align 1024load< результат > = load [volatile] <тип>* <указатель>[, align <выравнивание>]Инструкция „load„ используется для чтения из памяти.storestore [volatile] <тип> <значение>, <тип>* <указатель>[, align <выравнивание >]Инструкция „store‟ используется для записи в память.Пример:%ptr = alloca i32store i32 3, i32* %ptr%val = load i32* %ptr; выделить на стеке i32; записать 3 по указателю %ptr; считать значение по указателю ptr; val =3getelementptrИспользуется для получения адреса элемента составного типа данных.Инструкция только вычисляет адрес и не осуществляет доступ к памяти.<результат>=getelementptr<Типуказателя>*<переменная_указывающая_на_составной_тип>{, <тип> <индекс>}*<результат> = getelementptr inbounds < Тип указателя >*переменная_указывающая_на_составной_тип >{, <тип> <индекс>}*<Первый аргумент всегда указатель, являющийся базой для вычислений.Остальные аргументы являются индексами для обращения к элементамсоставного типа.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.