diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index cc932515d247..d4a7725d1fd6 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/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/llvm/lib/IR/DataLayout.cpp b/llvm/lib/IR/DataLayout.cpp index ee2b4bc4e7bc..c9e95b402156 100644 --- a/llvm/lib/IR/DataLayout.cpp +++ b/llvm/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));