Skip to content

Commit db79d76

Browse files
record bits uses bitfield
1 parent 9a2e0dc commit db79d76

File tree

7 files changed

+16
-26
lines changed

7 files changed

+16
-26
lines changed

include/mrdox/Metadata/Record.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ namespace mrdox {
3232

3333
/** Bit constants used with Record metadata
3434
*/
35-
enum class RecFlags0 : std::uint32_t
35+
union RecFlags0
3636
{
37-
isFinal = 0x00000001,
38-
isFinalDestructor = 0x00000002
37+
BitFieldFullValue raw{.value=0u};
38+
39+
BitFlag<0> isFinal;
40+
BitFlag<1> isFinalDestructor;
3941
};
4042

4143
/** Metadata for a direct base.
@@ -81,7 +83,7 @@ struct RecordInfo : SymbolInfo
8183
// are converted into records with the typedef as the Name + this flag set.
8284
bool IsTypeDef = false;
8385

84-
Bits<RecFlags0> specs;
86+
RecFlags0 specs;
8587

8688
llvm::SmallVector<MemberTypeInfo, 4> Members; // List of info about record members.
8789

source/api/AST/ASTVisitor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -695,9 +695,9 @@ buildRecord(
695695
parseFields(I, D, PublicOnly, AccessSpecifier::AS_public, R_);
696696

697697
// These are from CXXRecordDecl::isEffectivelyFinal()
698-
I.specs.set<RecFlags0::isFinal>(D->template hasAttr<FinalAttr>());
698+
I.specs.isFinal = D->template hasAttr<FinalAttr>();
699699
if(auto const DT = D->getDestructor())
700-
I.specs.set<RecFlags0::isFinalDestructor>(DT->template hasAttr<FinalAttr>());
700+
I.specs.isFinalDestructor = DT->template hasAttr<FinalAttr>();
701701

702702
if(TypedefNameDecl const* TD = D->getTypedefNameForAnonDecl())
703703
{

source/api/AST/AnyBlock.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -839,7 +839,7 @@ class RecordBlock
839839
case RECORD_IS_TYPE_DEF:
840840
return decodeRecord(R, I->IsTypeDef, Blob);
841841
case RECORD_BITS:
842-
return decodeRecord(R, Blob, I->specs);
842+
return decodeRecord<1u>(R, {&I->specs.raw}, Blob);
843843
case RECORD_FRIENDS:
844844
return decodeRecord(R, I->Friends, Blob);
845845
default:

source/api/AST/BitcodeWriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -931,7 +931,7 @@ emitBlock(
931931
emitSymbolPart(I);
932932
emitRecord(I.TagType, RECORD_TAG_TYPE);
933933
emitRecord(I.IsTypeDef, RECORD_IS_TYPE_DEF);
934-
emitRecord(RECORD_BITS, I.specs);
934+
emitRecord({I.specs.raw}, RECORD_BITS);
935935
for (const auto& N : I.Members)
936936
emitBlock(N);
937937
for (const auto& B : I.Bases)

source/api/Metadata/Interface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class Interface::Build
104104

105105
// Functions
106106
{
107-
auto const isFinal = From.specs.get<RecFlags0::isFinal>();
107+
auto const isFinal = From.specs.isFinal.get();
108108
for(auto const& ref : From.Children.Functions)
109109
{
110110
auto const& J = corpus_.get<FunctionInfo>(ref.id);

source/api/Metadata/Reduce.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ void merge(RecordInfo& I, RecordInfo&& Other)
124124
if (!I.TagType)
125125
I.TagType = Other.TagType;
126126
I.IsTypeDef = I.IsTypeDef || Other.IsTypeDef;
127-
I.specs.merge(std::move(Other).specs);
127+
I.specs.raw.value |= Other.specs.raw.value;
128128
if (I.Members.empty())
129129
I.Members = std::move(Other.Members);
130130
if (I.Bases.empty())

source/api/_XML/CXXTags.hpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,6 @@ constexpr llvm::StringRef dataMemberTagName = "data";
4949
constexpr llvm::StringRef javadocTagName = "doc";
5050
constexpr llvm::StringRef baseTagName = "base";
5151

52-
constexpr llvm::StringRef getBitsIDName(RecFlags0 ID)
53-
{
54-
switch(ID)
55-
{
56-
case RecFlags0::isFinal: return "is-final";
57-
case RecFlags0::isFinalDestructor: return "is-final-dtor";
58-
default:
59-
Assert(false);
60-
}
61-
return "";
62-
}
63-
64-
6552

6653
constexpr llvm::StringRef getNameForValue(...)
6754
{
@@ -236,10 +223,11 @@ struct BitFieldWriter
236223
template<class Enum>
237224
WriteBits(Bits<Enum> const&) -> WriteBits<Enum>;
238225

239-
inline void write(Bits<RecFlags0> const& bits, XMLTags& tags)
226+
inline void write(RecFlags0 const& bits, XMLTags& tags)
240227
{
241-
WriteBits(bits).write<RecFlags0::isFinal>(tags);
242-
WriteBits(bits).write<RecFlags0::isFinalDestructor>(tags);
228+
BitFieldWriter<RecFlags0> fw(bits, tags);
229+
fw.write(&RecFlags0::isFinal, "is-final");
230+
fw.write(&RecFlags0::isFinalDestructor, "is-final-dtor");
243231
}
244232

245233
inline void write(FnFlags0 const& bits, XMLTags& tags)

0 commit comments

Comments
 (0)