Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===--- LayoutOverrideSource.h --Override Record Layouts -------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8.  
  9. #ifndef LLVM_CLANG_FRONTEND_LAYOUTOVERRIDESOURCE_H
  10. #define LLVM_CLANG_FRONTEND_LAYOUTOVERRIDESOURCE_H
  11.  
  12. #include "clang/AST/ExternalASTSource.h"
  13. #include "clang/Basic/LLVM.h"
  14. #include "llvm/ADT/StringMap.h"
  15. #include "llvm/ADT/StringRef.h"
  16.  
  17. namespace clang {
  18.   /// An external AST source that overrides the layout of
  19.   /// a specified set of record types.
  20.   ///
  21.   /// This class is used only for testing the ability of external AST sources
  22.   /// to override the layout of record types. Its input is the output format
  23.   /// of the command-line argument -fdump-record-layouts.
  24.   class LayoutOverrideSource : public ExternalASTSource {
  25.     /// The layout of a given record.
  26.     struct Layout {
  27.       /// The size of the record.
  28.       uint64_t Size;
  29.  
  30.       /// The alignment of the record.
  31.       uint64_t Align;
  32.  
  33.       /// The offsets of the fields, in source order.
  34.       SmallVector<uint64_t, 8> FieldOffsets;
  35.     };
  36.  
  37.     /// The set of layouts that will be overridden.
  38.     llvm::StringMap<Layout> Layouts;
  39.  
  40.   public:
  41.     /// Create a new AST source that overrides the layout of some
  42.     /// set of record types.
  43.     ///
  44.     /// The file is the result of passing -fdump-record-layouts to a file.
  45.     explicit LayoutOverrideSource(StringRef Filename);
  46.  
  47.     /// If this particular record type has an overridden layout,
  48.     /// return that layout.
  49.     bool
  50.     layoutRecordType(const RecordDecl *Record,
  51.        uint64_t &Size, uint64_t &Alignment,
  52.        llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
  53.        llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
  54.        llvm::DenseMap<const CXXRecordDecl *,
  55.                       CharUnits> &VirtualBaseOffsets) override;
  56.  
  57.     /// Dump the overridden layouts.
  58.     void dump();
  59.   };
  60. }
  61.  
  62. #endif
  63.