struct CGBitFieldInfo

Declaration

struct CGBitFieldInfo { /* full declaration omitted */ };

Description

Structure with information about how a bitfield should be accessed. Often we layout a sequence of bitfields as a contiguous sequence of bits. When the AST record layout does this, we represent it in the LLVM IR's type as either a sequence of i8 members or a byte array to reserve the number of bytes touched without forcing any particular alignment beyond the basic character alignment. Then accessing a particular bitfield involves converting this byte array into a single integer of that size (i24 or i40 -- may not be power-of-two size), loading it, and shifting and masking to extract the particular subsequence of bits which make up that particular bitfield. This structure encodes the information used to construct the extraction code sequences. The CGRecordLayout also has a field index which encodes which byte-sequence this bitfield falls within. Let's assume the following C struct: struct S { char a, b, c; unsigned bits : 3; unsigned more_bits : 4; unsigned still_more_bits : 7; }; This will end up as the following LLVM type. The first array is the bitfield, and the second is the padding out to a 4-byte alignment. %t = type { i8, i8, i8, i8, i8, [3 x i8] } When generating code to access more_bits, we'll generate something essentially like this: define i32 @foo(%t* %base) { %0 = gep %t* %base, i32 0, i32 3 %2 = load i8* %1 %3 = lshr i8 %2, 3 %4 = and i8 %3, 15 %5 = zext i8 %4 to i32 ret i32 %i }

Declared at: clang/lib/CodeGen/CGRecordLayout.h:65

Member Variables

public unsigned int Offset
The offset within a contiguous run of bitfields that are represented as a single "field" within the LLVM struct type. This offset is in bits.
public unsigned int Size
The total size of the bit-field, in bits.
public unsigned int IsSigned
Whether the bit-field is signed.
public unsigned int StorageSize
The storage size in bits which should be used when accessing this bitfield.
public clang::CharUnits StorageOffset
The offset of the bitfield storage from the start of the struct.
public unsigned int VolatileOffset
The offset within a contiguous run of bitfields that are represented as a single "field" within the LLVM struct type, taking into account the AAPCS rules for volatile bitfields. This offset is in bits.
public unsigned int VolatileStorageSize
The storage size in bits which should be used when accessing this bitfield.
public clang::CharUnits VolatileStorageOffset
The offset of the bitfield storage from the start of the struct.

Method Overview

  • public CGBitFieldInfo()
  • public CGBitFieldInfo(unsigned int Offset, unsigned int Size, bool IsSigned, unsigned int StorageSize, clang::CharUnits StorageOffset)
  • public static clang::CodeGen::CGBitFieldInfo MakeInfo(class CodeGenTypes & Types, const clang::FieldDecl * FD, uint64_t Offset, uint64_t Size, uint64_t StorageSize, clang::CharUnits StorageOffset)
  • public void dump() const
  • public void print(llvm::raw_ostream & OS) const

Methods

CGBitFieldInfo()

Declared at: clang/lib/CodeGen/CGRecordLayout.h:95

CGBitFieldInfo(unsigned int Offset,
               unsigned int Size,
               bool IsSigned,
               unsigned int StorageSize,
               clang::CharUnits StorageOffset)

Declared at: clang/lib/CodeGen/CGRecordLayout.h:99

Parameters

unsigned int Offset
unsigned int Size
bool IsSigned
unsigned int StorageSize
clang::CharUnits StorageOffset

static clang::CodeGen::CGBitFieldInfo MakeInfo(
    class CodeGenTypes& Types,
    const clang::FieldDecl* FD,
    uint64_t Offset,
    uint64_t Size,
    uint64_t StorageSize,
    clang::CharUnits StorageOffset)

Description

Given a bit-field decl, build an appropriate helper object for accessing that field (which is expected to have the given offset and size).

Declared at: clang/lib/CodeGen/CGRecordLayout.h:110

Parameters

class CodeGenTypes& Types
const clang::FieldDecl* FD
uint64_t Offset
uint64_t Size
uint64_t StorageSize
clang::CharUnits StorageOffset

void dump() const

Declared at: clang/lib/CodeGen/CGRecordLayout.h:105

void print(llvm::raw_ostream& OS) const

Declared at: clang/lib/CodeGen/CGRecordLayout.h:104

Parameters

llvm::raw_ostream& OS