Make RenderScript constants variables instead of macros.

Implement the RenderScript constants as extern const variables
instead of macros. This allows lldb to inspect the RenderScript
constants, because their symbols will appear in the final shared
object. Old behaviour is retained for RS_VERSION < UNRELEASED.

Change-Id: I05d59a8560f264e82fdf84a92eeeec1d7db5a7a4

Signed-off-by: Verena Beckham <verena@codeplay.com>
diff --git a/api/GenerateHeaderFiles.cpp b/api/GenerateHeaderFiles.cpp
index ce778b3..9f40d3d 100644
--- a/api/GenerateHeaderFiles.cpp
+++ b/api/GenerateHeaderFiles.cpp
@@ -120,7 +120,13 @@
     const Constant* constant = spec.getConstant();
     VersionInfo info = spec.getVersionInfo();
     writeVersionGuardStart(file, info, constant->getFinalVersion());
-    *file << "#define " << constant->getName() << " " << spec.getValue() << "\n\n";
+
+    *file << "#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))\n";
+    *file << "extern const " << spec.getType() << " " << constant->getName() << ";\n";
+    *file << "#else\n";
+    *file << "#define " << constant->getName() << " " << spec.getValue() << "\n";
+    *file << "#endif\n\n";
+
     writeVersionGuardEnd(file, info);
 }
 
diff --git a/api/Generator.cpp b/api/Generator.cpp
index 456f214..f67e473 100644
--- a/api/Generator.cpp
+++ b/api/Generator.cpp
@@ -62,6 +62,7 @@
  * [version: ({Starting API level} [ {Last API level that supports this.}] | UNRELEASED)
  * [size: {32 or 64.  Used if this is available only for 32 or 64 bit code.}]
  * value: {The value of the constant.}
+ * type: {The type of the constant.}
  * [hidden:]   ...If present, don't document the constant.  Omit the following two fields.
  * [deprecated: [{Deprecation message.}]   ... This is deprecated.  Compiler will issue a wrning.
  * summary: {A one line string describing this section.}
diff --git a/api/Specification.cpp b/api/Specification.cpp
index 7afeea4..024b8b6 100644
--- a/api/Specification.cpp
+++ b/api/Specification.cpp
@@ -380,6 +380,9 @@
     if (scanner->findTag("value:")) {
         spec->mValue = scanner->getValue();
     }
+    if (scanner->findTag("type:")) {
+        spec->mType = scanner->getValue();
+    }
     constant->scanDocumentationTags(scanner, created, specFile);
 
     scanner->findTag("end:");
diff --git a/api/Specification.h b/api/Specification.h
index c467c5c..8326659 100644
--- a/api/Specification.h
+++ b/api/Specification.h
@@ -262,11 +262,13 @@
     Constant* mConstant;  // Not owned
 
     std::string mValue;  // E.g. "3.1415"
+    std::string mType;
 public:
     ConstantSpecification(Constant* constant) : mConstant(constant) {}
 
     Constant* getConstant() const { return mConstant; }
     std::string getValue() const { return mValue; }
+    std::string getType() const { return mType; }
 
     // Parse a constant specification and add it to specFile.
     static void scanConstantSpecification(Scanner* scanner, SpecFile* specFile, unsigned int maxApiLevel);
diff --git a/api/rs_math.spec b/api/rs_math.spec
index acc2eb6..96eee81 100644
--- a/api/rs_math.spec
+++ b/api/rs_math.spec
@@ -51,6 +51,7 @@
 # TODO Add f16 versions of these constants.
 constant: M_1_PI
 value: 0.318309886183790671537767526745028724f
+type: float
 summary: 1 / pi, as a 32 bit float
 description:
  The inverse of pi, as a 32 bit float.
@@ -58,6 +59,7 @@
 
 constant: M_2_PI
 value: 0.636619772367581343075535053490057448f
+type: float
 summary: 2 / pi, as a 32 bit float
 description:
  2 divided by pi, as a 32 bit float.
@@ -65,6 +67,7 @@
 
 constant: M_2_PIl
 value: 0.636619772367581343075535053490057448f
+type: float
 hidden:
 deprecated: 22, Use M_2_PI instead.
 summary: 2 / pi, as a 32 bit float
@@ -74,6 +77,7 @@
 
 constant: M_2_SQRTPI
 value: 1.128379167095512573896158903121545172f
+type: float
 summary:  2 / sqrt(pi), as a 32 bit float
 description:
  2 divided by the square root of pi, as a 32 bit float.
@@ -81,6 +85,7 @@
 
 constant: M_E
 value: 2.718281828459045235360287471352662498f
+type: float
 summary: e, as a 32 bit float
 description:
  The number e, the base of the natural logarithm, as a 32 bit float.
@@ -88,6 +93,7 @@
 
 constant: M_LN10
 value: 2.302585092994045684017991454684364208f
+type: float
 summary: log_e(10), as a 32 bit float
 description:
  The natural logarithm of 10, as a 32 bit float.
@@ -95,6 +101,7 @@
 
 constant: M_LN2
 value: 0.693147180559945309417232121458176568f
+type: float
 summary: log_e(2), as a 32 bit float
 description:
  The natural logarithm of 2, as a 32 bit float.
@@ -102,6 +109,7 @@
 
 constant: M_LOG10E
 value: 0.434294481903251827651128918916605082f
+type: float
 summary: log_10(e), as a 32 bit float
 description:
  The logarithm base 10 of e, as a 32 bit float.
@@ -109,6 +117,7 @@
 
 constant: M_LOG2E
 value: 1.442695040888963407359924681001892137f
+type: float
 summary: log_2(e), as a 32 bit float
 description:
  The logarithm base 2 of e, as a 32 bit float.
@@ -116,6 +125,7 @@
 
 constant: M_PI
 value: 3.141592653589793238462643383279502884f
+type: float
 summary: pi, as a 32 bit float
 description:
  The constant pi, as a 32 bit float.
@@ -123,6 +133,7 @@
 
 constant: M_PI_2
 value: 1.570796326794896619231321691639751442f
+type: float
 summary: pi / 2, as a 32 bit float
 description:
  Pi divided by 2, as a 32 bit float.
@@ -130,6 +141,7 @@
 
 constant: M_PI_4
 value: 0.785398163397448309615660845819875721f
+type: float
 summary: pi / 4, as a 32 bit float
 description:
  Pi divided by 4, as a 32 bit float.
@@ -137,6 +149,7 @@
 
 constant: M_SQRT1_2
 value: 0.707106781186547524400844362104849039f
+type: float
 summary: 1 / sqrt(2), as a 32 bit float
 description:
  The inverse of the square root of 2, as a 32 bit float.
@@ -144,6 +157,7 @@
 
 constant: M_SQRT2
 value: 1.414213562373095048801688724209698079f
+type: float
 summary: sqrt(2), as a 32 bit float
 description:
  The square root of 2, as a 32 bit float.
diff --git a/driver/runtime/rs_core.c b/driver/runtime/rs_core.c
index 10e360e..60d8578 100644
--- a/driver/runtime/rs_core.c
+++ b/driver/runtime/rs_core.c
@@ -3,6 +3,37 @@
 
 #include "rsCpuCoreRuntime.h"
 
+/* Definition of constants */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+const float M_1_PI = 0.318309886183790671537767526745028724f;
+
+const float M_2_PI = 0.636619772367581343075535053490057448f;
+
+const float M_2_PIl = 0.636619772367581343075535053490057448f;
+
+const float M_2_SQRTPI = 1.128379167095512573896158903121545172f;
+
+const float M_E = 2.718281828459045235360287471352662498f;
+
+const float M_LN10 = 2.302585092994045684017991454684364208f;
+
+const float M_LN2 = 0.693147180559945309417232121458176568f;
+
+const float M_LOG10E = 0.434294481903251827651128918916605082f;
+
+const float M_LOG2E = 1.442695040888963407359924681001892137f;
+
+const float M_PI = 3.141592653589793238462643383279502884f;
+
+const float M_PI_2 = 1.570796326794896619231321691639751442f;
+
+const float M_PI_4 = 0.785398163397448309615660845819875721f;
+
+const float M_SQRT1_2 = 0.707106781186547524400844362104849039f;
+
+const float M_SQRT2 = 1.414213562373095048801688724209698079f;
+#endif // (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+
 extern float __attribute__((overloadable)) rsFrac(float v) {
     int i = (int)floor(v);
     return fmin(v - i, 0x1.fffffep-1f);
diff --git a/scriptc/rs_math.rsh b/scriptc/rs_math.rsh
index 3d034d0..849b52e 100644
--- a/scriptc/rs_math.rsh
+++ b/scriptc/rs_math.rsh
@@ -58,14 +58,22 @@
  *
  * The inverse of pi, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_1_PI;
+#else
 #define M_1_PI 0.318309886183790671537767526745028724f
+#endif
 
 /*
  * M_2_PI: 2 / pi, as a 32 bit float
  *
  * 2 divided by pi, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_2_PI;
+#else
 #define M_2_PI 0.636619772367581343075535053490057448f
+#endif
 
 /*
  * M_2_PIl: 2 / pi, as a 32 bit float
@@ -74,84 +82,132 @@
  *
  * 2 divided by pi, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_2_PIl;
+#else
 #define M_2_PIl 0.636619772367581343075535053490057448f
+#endif
 
 /*
  * M_2_SQRTPI: 2 / sqrt(pi), as a 32 bit float
  *
  * 2 divided by the square root of pi, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_2_SQRTPI;
+#else
 #define M_2_SQRTPI 1.128379167095512573896158903121545172f
+#endif
 
 /*
  * M_E: e, as a 32 bit float
  *
  * The number e, the base of the natural logarithm, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_E;
+#else
 #define M_E 2.718281828459045235360287471352662498f
+#endif
 
 /*
  * M_LN10: log_e(10), as a 32 bit float
  *
  * The natural logarithm of 10, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_LN10;
+#else
 #define M_LN10 2.302585092994045684017991454684364208f
+#endif
 
 /*
  * M_LN2: log_e(2), as a 32 bit float
  *
  * The natural logarithm of 2, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_LN2;
+#else
 #define M_LN2 0.693147180559945309417232121458176568f
+#endif
 
 /*
  * M_LOG10E: log_10(e), as a 32 bit float
  *
  * The logarithm base 10 of e, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_LOG10E;
+#else
 #define M_LOG10E 0.434294481903251827651128918916605082f
+#endif
 
 /*
  * M_LOG2E: log_2(e), as a 32 bit float
  *
  * The logarithm base 2 of e, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_LOG2E;
+#else
 #define M_LOG2E 1.442695040888963407359924681001892137f
+#endif
 
 /*
  * M_PI: pi, as a 32 bit float
  *
  * The constant pi, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_PI;
+#else
 #define M_PI 3.141592653589793238462643383279502884f
+#endif
 
 /*
  * M_PI_2: pi / 2, as a 32 bit float
  *
  * Pi divided by 2, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_PI_2;
+#else
 #define M_PI_2 1.570796326794896619231321691639751442f
+#endif
 
 /*
  * M_PI_4: pi / 4, as a 32 bit float
  *
  * Pi divided by 4, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_PI_4;
+#else
 #define M_PI_4 0.785398163397448309615660845819875721f
+#endif
 
 /*
  * M_SQRT1_2: 1 / sqrt(2), as a 32 bit float
  *
  * The inverse of the square root of 2, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_SQRT1_2;
+#else
 #define M_SQRT1_2 0.707106781186547524400844362104849039f
+#endif
 
 /*
  * M_SQRT2: sqrt(2), as a 32 bit float
  *
  * The square root of 2, as a 32 bit float.
  */
+#if (defined(RS_VERSION) && (RS_VERSION >= UNRELEASED))
+extern const float M_SQRT2;
+#else
 #define M_SQRT2 1.414213562373095048801688724209698079f
+#endif
 
 /*
  * abs: Absolute value of an integer