From 177648336ab01faf4cee8a105a5f237642c23e98 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 6 Jan 2014 21:40:24 +0000 Subject: [PATCH] Improve documentation of the 'a' specifier and the ':' align pair. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198636 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LangRef.rst | 16 +++++++++------- lib/IR/DataLayout.cpp | 3 +++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/LangRef.rst b/docs/LangRef.rst index cc932515d24..d4a7725d1fd 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -1141,10 +1141,9 @@ as follows: ``p[n]:::`` This specifies the *size* of a pointer and its ```` and ````\erred alignments for address space ``n``. All sizes are in - bits. Specifying the ```` alignment is optional. If omitted, the - preceding ``:`` should be omitted too. The address space, ``n`` is - optional, and if not specified, denotes the default address space 0. - The value of ``n`` must be in the range [1,2^23). + bits. The address space, ``n`` is optional, and if not specified, + denotes the default address space 0. The value of ``n`` must be + in the range [1,2^23). ``i::`` This specifies the alignment for an integer type of a given bit ````. The value of ```` must be in the range [1,2^23). @@ -1157,9 +1156,8 @@ as follows: will work. 32 (float) and 64 (double) are supported on all targets; 80 or 128 (different flavors of long double) are also supported on some targets. -``a::`` - This specifies the alignment for an aggregate type of a given bit - ````. +``a::`` + This specifies the alignment for an object of aggregate type. ``m:`` If prerest, specifies that llvm names are mangled in the output. The options are @@ -1176,6 +1174,10 @@ as follows: this set are considered to support most general arithmetic operations efficiently. +On every specification that takes a ``:``, specifying the +```` alignment is optional. If omitted, the preceding ``:`` +should be omitted too and ```` will be equal to ````. + When constructing the data layout for a given target, LLVM starts with a default set of specifications which are then (possibly) overridden by the specifications in the ``datalayout`` keyword. The default diff --git a/lib/IR/DataLayout.cpp b/lib/IR/DataLayout.cpp index ee2b4bc4e7b..c9e95b40215 100644 --- a/lib/IR/DataLayout.cpp +++ b/lib/IR/DataLayout.cpp @@ -287,6 +287,9 @@ void DataLayout::parseSpecifier(StringRef Desc) { // Bit size. unsigned Size = Tok.empty() ? 0 : getInt(Tok); + assert((AlignType != AGGREGATE_ALIGN || Size == 0) && + "These specifications don't have a size"); + // ABI alignment. Split = split(Rest, ':'); unsigned ABIAlign = inBytes(getInt(Tok)); -- 2.34.1