[PATCH 3/6] include/wine/mscvpdb.h: redefine property with bitfields
Eric Pouech
wine at gitlab.winehq.org
Wed Jun 22 09:41:17 CDT 2022
From: Eric Pouech <eric.pouech at gmail.com>
stopping hard coding the bitfield values
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/dbghelp/msc.c | 10 +++++-----
include/wine/mscvpdb.h | 37 ++++++++++++++++++++++++++++---------
tools/winedump/msc.c | 38 +++++++++++++++++++-------------------
3 files changed, 52 insertions(+), 33 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index cad76a8245c..d23d89e4f2d 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -1015,7 +1015,7 @@ static struct symt* codeview_add_type_enum(struct codeview_type_parse* ctp,
static struct symt* codeview_add_type_struct(struct codeview_type_parse* ctp,
struct symt* existing,
const char* name, int structlen,
- enum UdtKind kind, unsigned property)
+ enum UdtKind kind, cv_property_t property)
{
struct symt_udt* symt;
@@ -1045,7 +1045,7 @@ static struct symt* codeview_add_type_struct(struct codeview_type_parse* ctp,
{
if (!(symt = codeview_cast_symt(existing, SymTagUDT))) return NULL;
/* should also check that all fields are the same */
- if (!(property & 0x80)) /* 0x80 = forward declaration */
+ if (!property.is_forward_defn)
{
if (!symt->size) /* likely prior forward declaration, set UDT size */
symt_set_udt_size(ctp->module, symt, structlen);
@@ -1195,7 +1195,7 @@ static struct symt* codeview_parse_one_type(struct codeview_type_parse* ctp,
if (details)
{
codeview_add_type(curr_type, symt);
- if (!(type->struct_v1.property & 0x80)) /* 0x80 = forward declaration */
+ if (!type->struct_v1.property.is_forward_defn)
codeview_add_type_struct_field_list(ctp, (struct symt_udt*)symt,
type->struct_v1.fieldlist);
}
@@ -1211,7 +1211,7 @@ static struct symt* codeview_parse_one_type(struct codeview_type_parse* ctp,
if (details)
{
codeview_add_type(curr_type, symt);
- if (!(type->struct_v2.property & 0x80)) /* 0x80 = forward declaration */
+ if (!type->struct_v2.property.is_forward_defn)
codeview_add_type_struct_field_list(ctp, (struct symt_udt*)symt,
type->struct_v2.fieldlist);
}
@@ -1227,7 +1227,7 @@ static struct symt* codeview_parse_one_type(struct codeview_type_parse* ctp,
if (details)
{
codeview_add_type(curr_type, symt);
- if (!(type->struct_v3.property & 0x80)) /* 0x80 = forward declaration */
+ if (!type->struct_v3.property.is_forward_defn)
codeview_add_type_struct_field_list(ctp, (struct symt_udt*)symt,
type->struct_v3.fieldlist);
}
diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
index e0f524ca46f..8fb30d25cc6 100644
--- a/include/wine/mscvpdb.h
+++ b/include/wine/mscvpdb.h
@@ -112,6 +112,25 @@ typedef unsigned short cv_typ16_t;
typedef unsigned int cv_typ_t;
typedef cv_typ_t cv_itemid_t;
+typedef struct cv_property_t
+{
+ unsigned short is_packed : 1;
+ unsigned short has_ctor : 1;
+ unsigned short has_overloaded_operator : 1;
+ unsigned short is_nested : 1;
+ unsigned short has_nested : 1;
+ unsigned short has_overloaded_assign : 1;
+ unsigned short has_operator_cast : 1;
+ unsigned short is_forward_defn : 1;
+ unsigned short is_scoped : 1;
+ unsigned short has_decorated_name : 1; /* follows name field */
+ unsigned short is_sealed : 1; /* not usage as base class */
+ unsigned short hfa : 2;
+ unsigned short is_intrinsic : 1;
+ unsigned short mocom : 2;
+}
+cv_property_t;
+
/* ======================================== *
* Type information
* ======================================== */
@@ -201,7 +220,7 @@ union codeview_type
unsigned short int id;
short int n_element;
cv_typ16_t fieldlist;
- short int property;
+ cv_property_t property;
cv_typ16_t derived;
cv_typ16_t vshape;
unsigned short int structlen; /* numeric leaf */
@@ -215,7 +234,7 @@ union codeview_type
unsigned short int len;
unsigned short int id;
short int n_element;
- short int property;
+ cv_property_t property;
cv_typ_t fieldlist;
cv_typ_t derived;
cv_typ_t vshape;
@@ -230,7 +249,7 @@ union codeview_type
unsigned short int len;
unsigned short int id;
short int n_element;
- short int property;
+ cv_property_t property;
cv_typ_t fieldlist;
cv_typ_t derived;
cv_typ_t vshape;
@@ -246,7 +265,7 @@ union codeview_type
unsigned short int id;
short int count;
cv_typ16_t fieldlist;
- short int property;
+ cv_property_t property;
unsigned short int un_len; /* numeric leaf */
#if 0
struct p_string p_name;
@@ -258,7 +277,7 @@ union codeview_type
unsigned short int len;
unsigned short int id;
short int count;
- short int property;
+ cv_property_t property;
cv_typ_t fieldlist;
unsigned short int un_len; /* numeric leaf */
#if 0
@@ -271,7 +290,7 @@ union codeview_type
unsigned short int len;
unsigned short int id;
short int count;
- short int property;
+ cv_property_t property;
cv_typ_t fieldlist;
unsigned short int un_len; /* numeric leaf */
#if 0
@@ -286,7 +305,7 @@ union codeview_type
short int count;
cv_typ16_t type;
cv_typ16_t fieldlist;
- short int property;
+ cv_property_t property;
struct p_string p_name;
} enumeration_v1;
@@ -295,7 +314,7 @@ union codeview_type
unsigned short int len;
unsigned short int id;
short int count;
- short int property;
+ cv_property_t property;
cv_typ_t type;
cv_typ_t fieldlist;
struct p_string p_name;
@@ -306,7 +325,7 @@ union codeview_type
unsigned short int len;
unsigned short int id;
short int count;
- short int property;
+ cv_property_t property;
cv_typ_t type;
cv_typ_t fieldlist;
char name[1];
diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c
index a7e3df961bb..8c38dd1819e 100644
--- a/tools/winedump/msc.c
+++ b/tools/winedump/msc.c
@@ -227,28 +227,28 @@ static const char* get_attr(unsigned attr)
return tmp;
}
-static const char* get_property(unsigned prop)
+static const char* get_property(cv_property_t prop)
{
static char tmp[1024];
unsigned pos = 0;
- if (!prop) return "none";
#define X(s) {if (pos) tmp[pos++] = ';'; strcpy(tmp + pos, s); pos += strlen(s);}
- if (prop & 0x0001) X("packed");
- if (prop & 0x0002) X("w/{cd}tor");
- if (prop & 0x0004) X("w/overloaded-ops");
- if (prop & 0x0008) X("nested-class");
- if (prop & 0x0010) X("has-nested-classes");
- if (prop & 0x0020) X("w/overloaded-assign");
- if (prop & 0x0040) X("w/casting-methods");
- if (prop & 0x0080) X("forward");
- if (prop & 0x0100) X("scoped");
- if (prop & 0x0200) X("decorated-name");
- if (prop & 0x0400) X("sealed-name");
- if (prop & 0x1800) pos += sprintf(tmp, "hfa%x", (prop >> 11) & 3);
- if (prop & 0x2000) X("intrinsic");
- if (prop & 0xC000) pos += sprintf(tmp, "mocom%x", prop >> 14);
+ if (prop.is_packed) X("packed");
+ if (prop.has_ctor) X("w/{cd}tor");
+ if (prop.has_overloaded_operator) X("w/overloaded-ops");
+ if (prop.is_nested) X("nested-class");
+ if (prop.has_nested) X("has-nested-classes");
+ if (prop.has_overloaded_assign) X("w/overloaded-assign");
+ if (prop.has_operator_cast) X("w/casting-methods");
+ if (prop.is_forward_defn) X("forward");
+ if (prop.is_scoped) X("scoped");
+ if (prop.has_decorated_name) X("decorated-name");
+ if (prop.is_sealed) X("sealed");
+ if (prop.hfa) pos += sprintf(tmp, "hfa%x", prop.hfa);
+ if (prop.is_intrinsic) X("intrinsic");
+ if (prop.mocom) pos += sprintf(tmp, "mocom%x", prop.mocom);
#undef X
+ if (!pos) return "none";
tmp[pos] = '\0';
assert(pos < sizeof(tmp));
@@ -902,7 +902,7 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type
str, type->struct_v3.n_element, get_property(type->struct_v3.property),
type->struct_v3.fieldlist, type->struct_v3.derived,
type->struct_v3.vshape, value);
- if (type->union_v3.property & 0x200)
+ if (type->union_v3.property.has_decorated_name)
printf("\t\tDecorated name:%s\n", str + strlen(str) + 1);
break;
@@ -929,7 +929,7 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type
curr_type, str, type->union_v3.count,
get_property(type->union_v3.property),
type->union_v3.fieldlist, value);
- if (type->union_v3.property & 0x200)
+ if (type->union_v3.property.has_decorated_name)
printf("\t\tDecorated name:%s\n", str + strlen(str) + 1);
break;
@@ -958,7 +958,7 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type
type->enumeration_v3.fieldlist,
type->enumeration_v3.count,
get_property(type->enumeration_v3.property));
- if (type->union_v3.property & 0x200)
+ if (type->union_v3.property.has_decorated_name)
printf("\t\tDecorated name:%s\n", type->enumeration_v3.name + strlen(type->enumeration_v3.name) + 1);
break;
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/298
More information about the wine-devel
mailing list