Skip to content

Commit 10bfad0

Browse files
function bits uses bitfield
1 parent a64d3cf commit 10bfad0

File tree

9 files changed

+135
-153
lines changed

9 files changed

+135
-153
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ find_package(Clang REQUIRED CONFIG)
7979
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
8080
include(HandleLLVMOptions)
8181
add_definitions(${LLVM_DEFINITIONS})
82-
llvm_map_components_to_libnames(llvm_libs support core irreader)
82+
llvm_map_components_to_libnames(llvm_libs all)
8383
unset(CMAKE_FOLDER)
8484

8585
#-------------------------------------------------

include/mrdox/Metadata/Function.hpp

Lines changed: 35 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#define MRDOX_METADATA_FUNCTION_HPP
1414

1515
#include <mrdox/Platform.hpp>
16-
#include <mrdox/Metadata/Bits.hpp>
16+
#include <mrdox/Metadata/BitField.hpp>
1717
#include <mrdox/Metadata/FieldType.hpp>
1818
#include <mrdox/Metadata/Function.hpp>
1919
#include <mrdox/Metadata/Symbol.hpp>
@@ -23,70 +23,51 @@
2323
#include <llvm/ADT/Optional.h>
2424
#include <llvm/ADT/SmallString.h>
2525
#include <llvm/ADT/SmallVector.h>
26+
#include <clang/AST/Attr.h>
2627
#include <vector>
2728

2829
namespace clang {
2930
namespace mrdox {
3031

3132
/** Bit constants used with function specifiers.
3233
*/
33-
enum class FnFlags0 : std::uint32_t
34+
union FnFlags0
3435
{
35-
// Function Decl
36-
37-
isVariadic = 0x00000001, // has a C-style "..." variadic
38-
isVirtual = 0x00000002,
39-
isVirtualAsWritten = 0x00000004,
40-
isPure = 0x00000008,
41-
isDefaulted = 0x00000010,
42-
isExplicitlyDefaulted = 0x00000020,
43-
isDeleted = 0x00000040,
44-
isDeletedAsWritten = 0x00000080,
45-
isNoReturn = 0x00000100,
46-
47-
hasOverrideAttr = 0x00000200,
48-
hasTrailingReturn = 0x00000400,
49-
50-
constexprKind = 0x00000800 +
51-
0x00001000,
52-
exceptionSpecType = 0x00002000 +
53-
0x00004000 +
54-
0x00008000 +
55-
0x00010000,
56-
overloadedOperator = 0x00020000 +
57-
0x00040000 +
58-
0x00080000 +
59-
0x00100000 +
60-
0x00200000 +
61-
0x00400000,
62-
63-
storageClass = 0x00800000 +
64-
0x01000000 +
65-
0x02000000,
66-
67-
// CXXMethodDecl
68-
69-
isConst = 0x04000000,
70-
isVolatile = 0x08000000,
71-
72-
refQualifier = 0x10000000 +
73-
0x20000000
36+
BitFieldFullValue raw;
37+
38+
BitFlag<0> isVariadic;
39+
BitFlag<1> isVirtual;
40+
BitFlag<2> isVirtualAsWritten;
41+
BitFlag<3> isPure;
42+
BitFlag<4> isDefaulted;
43+
BitFlag<5> isExplicitlyDefaulted;
44+
BitFlag<6> isDeleted;
45+
BitFlag<7> isDeletedAsWritten;
46+
BitFlag<8> isNoReturn;
47+
48+
BitFlag<9> hasOverrideAttr;
49+
BitFlag<10> hasTrailingReturn;
50+
BitField<11, 2, ConstexprSpecKind> constexprKind;
51+
BitField<13, 4, ExceptionSpecificationType> exceptionSpecType;
52+
BitField<17, 6, OverloadedOperatorKind> overloadedOperator;
53+
BitField<23, 3, StorageClass> storageClass;
54+
BitFlag<26> isConst;
55+
BitFlag<27> isVolatile;
56+
BitField<28, 2, RefQualifierKind> refQualifier;
7457
};
7558

76-
/** Bit constants used with function specifiers.
77-
*/
78-
enum class FnFlags1 : std::uint32_t
79-
{
80-
isNodiscard = 0x00000001,
8159

82-
nodiscardSpelling = 0x00000002 +
83-
0x00000004 +
84-
0x00000008 +
85-
0x00000010,
8660

87-
isExplicit = 0x00000020,
61+
/** Bit field used with function specifiers.
62+
*/
63+
union FnFlags1
64+
{
65+
BitFieldFullValue raw;
8866

89-
functionKind = 0b00000000'00000000'00011111'11000000
67+
BitFlag<0> isNodiscard;
68+
BitField<1, 4, WarnUnusedResultAttr::Spelling> nodiscardSpelling;
69+
BitFlag<5> isExplicit;
70+
BitField<6, 7> functionKind;
9071
};
9172

9273
// TODO: Expand to allow for documenting templating and default args.
@@ -111,8 +92,8 @@ struct FunctionInfo : SymbolInfo
11192
// When present, this function is a template or specialization.
11293
llvm::Optional<TemplateInfo> Template;
11394

114-
Bits<FnFlags0> specs0;
115-
Bits<FnFlags1> specs1;
95+
FnFlags0 specs0{.raw{0}};
96+
FnFlags1 specs1{.raw{0}};
11697

11798
//--------------------------------------------
11899

source/api/AST/ASTVisitor.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -806,30 +806,30 @@ buildFunction(
806806
//
807807
// FunctionDecl
808808
//
809-
I.specs0.set<FnFlags0::isVariadic>(D->isVariadic());
810-
I.specs0.set<FnFlags0::isDefaulted>(D->isDefaulted());
811-
I.specs0.set<FnFlags0::isExplicitlyDefaulted>(D->isExplicitlyDefaulted());
812-
I.specs0.set<FnFlags0::isDeleted>(D->isDeleted());
813-
I.specs0.set<FnFlags0::isDeletedAsWritten>(D->isDeletedAsWritten());
814-
I.specs0.set<FnFlags0::isNoReturn>(D->isNoReturn());
809+
I.specs0.isVariadic = D->isVariadic();
810+
I.specs0.isDefaulted = D->isDefaulted();
811+
I.specs0.isExplicitlyDefaulted = D->isExplicitlyDefaulted();
812+
I.specs0.isDeleted = D->isDeleted();
813+
I.specs0.isDeletedAsWritten = D->isDeletedAsWritten();
814+
I.specs0.isNoReturn = D->isNoReturn();
815815
// subsumes D->hasAttr<NoReturnAttr>()
816816
// subsumes D->hasAttr<CXX11NoReturnAttr>()
817817
// subsumes D->hasAttr<C11NoReturnAttr>()
818818
// subsumes D->getType()->getAs<FunctionType>()->getNoReturnAttr()
819-
I.specs0.set<FnFlags0::hasOverrideAttr>(D->template hasAttr<OverrideAttr>());
819+
I.specs0.hasOverrideAttr = D->template hasAttr<OverrideAttr>();
820820
if(auto const* FP = D->getType()->template getAs<FunctionProtoType>())
821-
I.specs0.set<FnFlags0::hasTrailingReturn>(FP->hasTrailingReturn());
822-
I.specs0.set<FnFlags0::constexprKind>(D->getConstexprKind());
821+
I.specs0.hasTrailingReturn= FP->hasTrailingReturn();
822+
I.specs0.constexprKind = D->getConstexprKind();
823823
// subsumes D->isConstexpr();
824824
// subsumes D->isConstexprSpecified();
825825
// subsumes D->isConsteval();
826-
I.specs0.set<FnFlags0::exceptionSpecType>(D->getExceptionSpecType());
827-
I.specs0.set<FnFlags0::overloadedOperator>(D->getOverloadedOperator());
828-
I.specs0.set<FnFlags0::storageClass>(D->getStorageClass());
826+
I.specs0.exceptionSpecType = D->getExceptionSpecType();
827+
I.specs0.overloadedOperator = D->getOverloadedOperator();
828+
I.specs0.storageClass = D->getStorageClass();
829829
if(auto attr = D->template getAttr<WarnUnusedResultAttr>())
830830
{
831-
I.specs1.set<FnFlags1::isNodiscard>(true);
832-
I.specs1.set<FnFlags1::nodiscardSpelling>(attr->getSemanticSpelling());
831+
I.specs1.isNodiscard = true;
832+
I.specs1.nodiscardSpelling = attr->getSemanticSpelling();
833833
}
834834

835835
if constexpr(! std::derived_from<DeclTy, CXXMethodDecl>)
@@ -856,12 +856,12 @@ buildFunction(
856856
InfoType::IT_record);
857857
I.Access = D->getAccess();
858858

859-
I.specs0.set<FnFlags0::isVirtual>(D->isVirtual());
860-
I.specs0.set<FnFlags0::isVirtualAsWritten>(D->isVirtualAsWritten());
861-
I.specs0.set<FnFlags0::isPure>(D->isPure());
862-
I.specs0.set<FnFlags0::isConst>(D->isConst());
863-
I.specs0.set<FnFlags0::isVolatile>(D->isVolatile());
864-
I.specs0.set<FnFlags0::refQualifier>(D->getRefQualifier());
859+
I.specs0.isVirtual = D->isVirtual();
860+
I.specs0.isVirtualAsWritten = D->isVirtualAsWritten();
861+
I.specs0.isPure = D->isPure();
862+
I.specs0.isConst = D->isConst();
863+
I.specs0.isVolatile = D->isVolatile();
864+
I.specs0.refQualifier = D->getRefQualifier();
865865
//D->isCopyAssignmentOperator()
866866
//D->isMoveAssignmentOperator()
867867
//D->isOverloadedOperator();
@@ -882,7 +882,7 @@ buildFunction(
882882
if constexpr(std::derived_from<DeclTy, CXXConstructorDecl>)
883883
{
884884
//I.Name.append("-ctor");
885-
I.specs1.set<FnFlags1::isExplicit>(D->getExplicitSpecifier().isSpecified());
885+
I.specs1.isExplicit = D->getExplicitSpecifier().isSpecified();
886886
}
887887

888888
//
@@ -891,15 +891,15 @@ buildFunction(
891891
if constexpr(std::derived_from<DeclTy, CXXConversionDecl>)
892892
{
893893
//I.Name.append("-conv");
894-
I.specs1.set<FnFlags1::isExplicit>(D->getExplicitSpecifier().isSpecified());
894+
I.specs1.isExplicit = D->getExplicitSpecifier().isSpecified();
895895
}
896896

897897
//
898898
// CXXDeductionGuideDecl
899899
//
900900
if constexpr(std::derived_from<DeclTy, CXXDeductionGuideDecl>)
901901
{
902-
I.specs1.set<FnFlags1::isExplicit>(D->getExplicitSpecifier().isSpecified());
902+
I.specs1.isExplicit = D->getExplicitSpecifier().isSpecified();
903903
}
904904

905905
return true;

source/api/AST/AnyBlock.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ class FunctionBlock
899899
case FUNCTION_IS_METHOD:
900900
return decodeRecord(R, I->IsMethod, Blob);
901901
case FUNCTION_BITS:
902-
return decodeRecord(R, Blob, I->specs0, I->specs1);
902+
return decodeRecord<2u>(R, {&I->specs0.raw, &I->specs1.raw}, Blob);
903903
default:
904904
return TopLevelBlock::parseRecord(R, ID, Blob);
905905
}

source/api/Metadata/Interface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class Interface::Build
114114
// unless this class is marked `final`.
115115
if( includePrivate_ ||
116116
actualAccess != Access::Private ||
117-
( ! isFinal && J.specs0.get<FnFlags0::isVirtual>()))
117+
( ! isFinal && J.specs0.isVirtual ))
118118
{
119119
I_.functions_.push_back({ &J, &From, actualAccess });
120120
}

source/api/Metadata/Reduce.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ void merge(FunctionInfo& I, FunctionInfo&& Other)
170170
mergeSymbolInfo(I, std::move(Other));
171171
if (!I.Template)
172172
I.Template = Other.Template;
173-
I.specs0.merge(std::move(Other).specs0);
174-
I.specs1.merge(std::move(Other).specs1);
173+
I.specs0.raw.value |= Other.specs0.raw.value;
174+
I.specs1.raw.value |= Other.specs1.raw.value;
175175
}
176176

177177
void merge(TypedefInfo& I, TypedefInfo&& Other)

source/api/Support/SafeNames.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ class SafeNames::
113113
return I.Name;
114114
auto const& FI = static_cast<
115115
FunctionInfo const&>(I);
116-
auto OOK = FI.specs0.get<
117-
FnFlags0::overloadedOperator,
118-
OverloadedOperatorKind>();
116+
auto OOK = FI.specs0.overloadedOperator.get();
119117
if(OOK == OverloadedOperatorKind::OO_None)
120118
return I.Name;
121119
temp_ = '0';

0 commit comments

Comments
 (0)