Dr. ERDI Gergo via llvm-dev
2017-May-22 14:48 UTC
[llvm-dev] How exactly is datatype alignment determined?
On Mon, 22 May 2017, Krzysztof Parzyszek via llvm-dev wrote:> Probably from LargeArrayMinWidth/LargeArrayAlign settings in Targets.cpp (in > clang).Wait what? In clang? But my input is already LLVM IR. MF->getDataLayout().getPrefTypeAlignment(Ty) must be basing its answer on either something in the IR file, or in the target implementation, but clang is not really in the picture.
Dr. ERDI Gergo via llvm-dev
2017-May-22 15:08 UTC
[llvm-dev] How exactly is datatype alignment determined?
On Mon, 22 May 2017, Dr. ERDI Gergo wrote:> On Mon, 22 May 2017, Krzysztof Parzyszek via llvm-dev wrote: > >> Probably from LargeArrayMinWidth/LargeArrayAlign settings in Targets.cpp >> (in clang). > > Wait what? In clang? But my input is already LLVM IR. > MF->getDataLayout().getPrefTypeAlignment(Ty) must be basing its answer on > either something in the IR file, or in the target implementation, but clang > is not really in the picture. >Actually, tracking down the sequence of function calls, it turns out that '8' is ultimately coming from the following call in DataLayout::getAlignment: getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty); this seems to return 8 with the following datalayout string: e-S8:p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8 I think my problem is that 'a:8' probably doesn't mean what I think it should mean. What is the difference between 'a:8' and 'a:0'?
Dr. ERDI Gergo via llvm-dev
2017-May-22 15:26 UTC
[llvm-dev] How exactly is datatype alignment determined?
On Mon, 22 May 2017, Dr. ERDI Gergo wrote:> Actually, tracking down the sequence of function calls, it turns out that '8' > is ultimately coming from the following call in DataLayout::getAlignment: > > getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty); > > this seems to return 8 with the following datalayout string: > > e-S8:p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8 > > I think my problem is that 'a:8' probably doesn't mean what I think it should > mean. What is the difference between 'a:8' and 'a:0'?OK I just now tried with 'a:0' for identical result. I am now quite sure I am fully confused about what these alignment settings mean. Does 'a:8' mean single byte alignment (i.e. *no* alignment)? If yes, does that mean getAlignment for a struct type should return 1? In fact, when getAlignment returns 8, does that mean 8 bits (no alignment) or 8 bytes (64 bits) alignment? Or does that mean the lowest 8 bits of the address needs to be 0, i.e. 256-byte alignment?