fix for XDCTOOLS-428
diff --git a/src/packages/xdc/rov/Program.xs b/src/packages/xdc/rov/Program.xs
index d8076d9..7aac796 100644
--- a/src/packages/xdc/rov/Program.xs
+++ b/src/packages/xdc/rov/Program.xs
@@ -1407,14 +1407,23 @@
}
return (jsType);
}
+
/*
* ======== lookupType ========
*/
-function lookupType(type)
+function lookupType(typename)
{
- var javaType = Program.ofReader.getType(type);
+ var javaType = Program.ofReader.getType(typename);
if (javaType == null) {
- return null;
+ /* try one of the standard C99 types */
+ var typespec = _c99Type(typename);
+ if (typespec == null) {
+ return null;
+ }
+ /* typespec is already a native JavaScript object, no need to call
+ * _convertType.
+ */
+ return (typespec)
}
else {
return (_convertType(javaType));
@@ -1720,6 +1729,176 @@
}
/*
+ * ======== _c99Type ========
+ * Returns a typespec for most of the standard C99 types. This function is
+ * called if the description of the type is not available in .dwarf_info.
+ */
+function _c99Type(typename) {
+ var spec = {
+ size: null,
+ encoding: null,
+ member: null,
+ offset: null,
+ elnum: null
+ };
+
+ var elfTarget = Program.ofReader.getTarget();
+ var stdTypes = Program.build.target.stdTypes;
+ switch (typename) {
+ case "uint8_t":
+ if (elfTarget.charsize > 1) {
+ return (null);
+ }
+ spec.encoding = 7;
+ spec.size = 1;
+ return (spec);
+ case "int8_t":
+ if (elfTarget.charsize > 1) {
+ return (null);
+ }
+ spec.encoding = 5;
+ spec.size = 1;
+ return (spec);
+ case "uint16_t":
+ spec.encoding = 7;
+ spec.size = 16/(elfTarget.charsize * 8);
+ return (spec);
+ case "int16_t":
+ spec.encoding = 5;
+ spec.size = 16/(elfTarget.charsize * 8);
+ return (spec);
+ case "uint32_t":
+ spec.encoding = 7;
+ spec.size = 32/(elfTarget.charsize * 8);
+ return (spec);
+ case "int32_t":
+ spec.encoding = 5;
+ spec.size = 32/(elfTarget.charsize * 8);
+ return (spec);
+ case "uint64_t":
+ spec.encoding = 7;
+ spec.size = 64/(elfTarget.charsize * 8);
+ return (spec);
+ case "int64_t":
+ spec.encoding = 5;
+ spec.size = 64/(elfTarget.charsize * 8);
+ return (spec);
+
+ case "uint_least8_t":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_Int8.size;;
+ return (spec);
+ case "int_least8_t":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_Int8.size;
+ return (spec);
+ case "uint_least16_t":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_Int16.size;
+ return (spec);
+ case "int_least16_t":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_Int16.size;
+ return (spec);
+ case "uint_least32_t":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_Int32.size;
+ return (spec);
+ case "int_least32_t":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_Int32.size;
+ return (spec);
+ case "uint_least64_t":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_Int64.size;
+ return (spec);
+ case "int_least64_t":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_Int64.size;
+ return (spec);
+ case "unsigned char":
+ case "char":
+ /* This is implementation specific for "char". It is an unsigned
+ * encoding because that's how it is on Arm.
+ */
+ spec.encoding = 8;
+ spec.size = stdTypes.t_Char.size;
+ return (spec);
+ case "signed char":
+ spec.encoding = 6;
+ spec.size = stdTypes.t_Char.size;
+ return (spec);
+ case "unsigned short":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_Short.size;
+ return (spec);
+ case "signed short":
+ case "short":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_Short.size;
+ return (spec);
+ case "unsigned":
+ case "unsigned int":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_Int.size;
+ return (spec);
+ case "signed int":
+ case "int":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_Int.size;
+ return (spec);
+ case "unsigned long":
+ case "unsigned long int":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_Long.size;
+ return (spec);
+ case "signed long":
+ case "long":
+ case "long int":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_Long.size;
+ return (spec);
+ case "unsigned long long":
+ case "unsigned long long int":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_LLong.size;
+ return (spec);
+ case "signed long long":
+ case "long long":
+ case "long long int":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_LLong.size;
+ return (spec);
+ case "float":
+ spec.encoding = 4;
+ spec.size = stdTypes.t_Float.size;
+ return (spec);
+ case "double":
+ spec.encoding = 4;
+ spec.size = stdTypes.t_Double.size;
+ return (spec);
+ case "long double":
+ spec.encoding = 4;
+ spec.size = stdTypes.t_LDouble.size;
+ return (spec);
+ case "uintptr_t":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_IArg.size;
+ return (spec);
+ case "intptr_t":
+ spec.encoding = 5;
+ spec.size = stdTypes.t_IArg.size;
+ return (spec);
+ case "size_t":
+ spec.encoding = 7;
+ spec.size = stdTypes.t_SizeT.size;
+ return (spec);
+ default:
+ return (null);
+ }
+}
+
+/*
* ======== _getTabArgs ========
* Extract optional arguments from parameters passed to get a view
*/