summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Marie de Rodat <derodat@adacore.com>2017-03-31 14:22:17 (GMT)
committerPierre-Marie de Rodat <derodat@adacore.com>2018-03-23 18:02:46 (GMT)
commit321b8b7d53f836aeb2c4a433bcc9e606de0ee1e8 (patch)
tree150d6228e64472b7dab1f700db8113bcb0e1ce12
parent322fcc15f9964b2b940a3b1dbaa7bb519937ab0c (diff)
downloadcv2pdb-321b8b7d53f836aeb2c4a433bcc9e606de0ee1e8.zip
cv2pdb-321b8b7d53f836aeb2c4a433bcc9e606de0ee1e8.tar.gz
cv2pdb-321b8b7d53f836aeb2c4a433bcc9e606de0ee1e8.tar.bz2
CV2PDB::addDWARFBasicType: split primitive type handling out
This isolates the part of the method that gets a type ID for a primitive type, so that it can be re-used elsewhere, in particular in enum translation.
-rw-r--r--src/cv2pdb.h1
-rw-r--r--src/dwarf2pdb.cpp121
2 files changed, 64 insertions, 58 deletions
diff --git a/src/cv2pdb.h b/src/cv2pdb.h
index aea458b..e63ea65 100644
--- a/src/cv2pdb.h
+++ b/src/cv2pdb.h
@@ -180,6 +180,7 @@ public:
int& basetype, int& lowerBound, int& upperBound);
void getDWARFSubrangeInfo(DWARF_InfoData& subrangeid, DWARF_CompilationUnit* cu,
int& basetype, int& lowerBound, int& upperBound);
+ int getDWARFBasicType(int encoding, int byte_size);
bool mapTypes();
bool createTypes();
diff --git a/src/dwarf2pdb.cpp b/src/dwarf2pdb.cpp
index 63e685e..bac8448 100644
--- a/src/dwarf2pdb.cpp
+++ b/src/dwarf2pdb.cpp
@@ -943,6 +943,68 @@ void CV2PDB::getDWARFSubrangeInfo(DWARF_InfoData& subrangeid, DWARF_CompilationU
upperBound = subrangeid.upper_bound;
}
+int CV2PDB::getDWARFBasicType(int encoding, int byte_size)
+{
+ int type = 0, mode = 0, size = 0;
+ switch (encoding)
+ {
+ case DW_ATE_boolean: type = 3; break;
+ case DW_ATE_complex_float: type = 5; byte_size /= 2; break;
+ case DW_ATE_float: type = 4; break;
+ case DW_ATE_signed: type = 1; break;
+ case DW_ATE_signed_char: type = 7; break;
+ case DW_ATE_unsigned: type = 2; break;
+ case DW_ATE_unsigned_char: type = 7; break;
+ case DW_ATE_imaginary_float:type = 4; break;
+ case DW_ATE_UTF: type = 7; break;
+ default:
+ setError("unknown basic type encoding");
+ }
+ switch (type)
+ {
+ case 1: // signed
+ case 2: // unsigned
+ case 3: // boolean
+ switch (byte_size)
+ {
+ case 1: size = 0; break;
+ case 2: size = 1; break;
+ case 4: size = 2; break;
+ case 8: size = 3; break;
+ case 16: size = 4; break; // __int128? experimental, type exists with GCC for Win64
+ default:
+ setError("unsupported integer type size");
+ }
+ break;
+ case 4:
+ case 5:
+ switch (byte_size)
+ {
+ case 4: size = 0; break;
+ case 8: size = 1; break;
+ case 10: size = 2; break;
+ case 12: size = 2; break; // with padding bytes
+ case 16: size = 3; break;
+ case 6: size = 4; break;
+ default:
+ setError("unsupported real type size");
+ }
+ break;
+ case 7:
+ switch (byte_size)
+ {
+ case 1: size = 0; break;
+ case 2: size = encoding == DW_ATE_signed_char ? 2 : 3; break;
+ case 4: size = encoding == DW_ATE_signed_char ? 4 : 5; break;
+ case 8: size = encoding == DW_ATE_signed_char ? 6 : 7; break;
+ default:
+ setError("unsupported real int type size");
+ }
+ }
+ int t = size | (type << 4);
+ return translateType(t);
+}
+
int CV2PDB::addDWARFArray(DWARF_InfoData& arrayid, DWARF_CompilationUnit* cu,
DIECursor cursor)
{
@@ -1033,64 +1095,7 @@ bool CV2PDB::addDWARFSectionContrib(mspdb::Mod* mod, unsigned long pclo, unsigne
int CV2PDB::addDWARFBasicType(const char*name, int encoding, int byte_size)
{
- int type = 0, mode = 0, size = 0;
- switch(encoding)
- {
- case DW_ATE_boolean: type = 3; break;
- case DW_ATE_complex_float: type = 5; byte_size /= 2; break;
- case DW_ATE_float: type = 4; break;
- case DW_ATE_signed: type = 1; break;
- case DW_ATE_signed_char: type = 7; break;
- case DW_ATE_unsigned: type = 2; break;
- case DW_ATE_unsigned_char: type = 7; break;
- case DW_ATE_imaginary_float:type = 4; break;
- case DW_ATE_UTF: type = 7; break;
- default:
- setError("unknown basic type encoding");
- }
- switch(type)
- {
- case 1: // signed
- case 2: // unsigned
- case 3: // boolean
- switch(byte_size)
- {
- case 1: size = 0; break;
- case 2: size = 1; break;
- case 4: size = 2; break;
- case 8: size = 3; break;
- case 16: size = 4; break; // __int128? experimental, type exists with GCC for Win64
- default:
- setError("unsupported integer type size");
- }
- break;
- case 4:
- case 5:
- switch(byte_size)
- {
- case 4: size = 0; break;
- case 8: size = 1; break;
- case 10: size = 2; break;
- case 12: size = 2; break; // with padding bytes
- case 16: size = 3; break;
- case 6: size = 4; break;
- default:
- setError("unsupported real type size");
- }
- break;
- case 7:
- switch(byte_size)
- {
- case 1: size = 0; break;
- case 2: size = encoding == DW_ATE_signed_char ? 2 : 3; break;
- case 4: size = encoding == DW_ATE_signed_char ? 4 : 5; break;
- case 8: size = encoding == DW_ATE_signed_char ? 6 : 7; break;
- default:
- setError("unsupported real int type size");
- }
- }
- int t = size | (type << 4);
- t = translateType(t);
+ int t = getDWARFBasicType(encoding, byte_size);
int cvtype = appendTypedef(t, name, false);
if(useTypedefEnum)
addUdtSymbol(cvtype, name);