[vulkan] put null optinal string marshaling behind a flag (guest)

bug: 111137294

System images without the support need different marshaling

Change-Id: Iff950810d34d347022deee7928848b5cf7bee544
diff --git a/system/OpenglSystemCommon/EmulatorFeatureInfo.h b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
index 518273a..d3228f5 100644
--- a/system/OpenglSystemCommon/EmulatorFeatureInfo.h
+++ b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
@@ -79,6 +79,9 @@
 // Deferred Vulkan commands
 static const char kDeferredVulkanCommands[] = "ANDROID_EMU_deferred_vulkan_commands";
 
+// Vulkan null optional strings
+static const char kVulkanNullOptionalStrings[] = "ANDROID_EMU_vulkan_null_optional_strings";
+
 // Struct describing available emulator features
 struct EmulatorFeatureInfo {
 
@@ -89,7 +92,8 @@
         glesMaxVersion(GLES_MAX_VERSION_2),
         hasDirectMem(false),
         hasVulkan(false),
-        hasDeferredVulkanCommands(false) { }
+        hasDeferredVulkanCommands(false),
+        hasVulkanNullOptionalStrings(false) { }
 
     SyncImpl syncImpl;
     DmaImpl dmaImpl;
@@ -98,6 +102,7 @@
     bool hasDirectMem;
     bool hasVulkan;
     bool hasDeferredVulkanCommands;
+    bool hasVulkanNullOptionalStrings;
 };
 
 #endif // __COMMON_EMULATOR_FEATURE_INFO_H
diff --git a/system/OpenglSystemCommon/HostConnection.cpp b/system/OpenglSystemCommon/HostConnection.cpp
index b6d465c..a6d19a8 100644
--- a/system/OpenglSystemCommon/HostConnection.cpp
+++ b/system/OpenglSystemCommon/HostConnection.cpp
@@ -292,6 +292,7 @@
         queryAndSetHostCompositionImpl(m_rcEnc);
         queryAndSetDirectMemSupport(m_rcEnc);
         queryAndSetVulkanSupport(m_rcEnc);
+        queryAndSetVulkanNullOptionalStringsSupport(m_rcEnc);
         if (m_processPipe) {
             m_processPipe->processPipeInit(m_rcEnc);
         }
@@ -447,3 +448,10 @@
         rcEnc->featureInfo()->hasDeferredVulkanCommands = true;
     }
 }
+
+void HostConnection::queryAndSetVulkanNullOptionalStringsSupport(ExtendedRCEncoderContext* rcEnc) {
+    std::string glExtensions = queryGLExtensions(rcEnc);
+    if (glExtensions.find(kVulkanNullOptionalStrings) != std::string::npos) {
+        rcEnc->featureInfo()->hasVulkanNullOptionalStrings = true;
+    }
+}
diff --git a/system/OpenglSystemCommon/HostConnection.h b/system/OpenglSystemCommon/HostConnection.h
index 922c35c..2f9f83f 100644
--- a/system/OpenglSystemCommon/HostConnection.h
+++ b/system/OpenglSystemCommon/HostConnection.h
@@ -166,6 +166,7 @@
     void queryAndSetDirectMemSupport(ExtendedRCEncoderContext *rcEnc);
     void queryAndSetVulkanSupport(ExtendedRCEncoderContext *rcEnc);
     void queryAndSetDeferredVulkanCommandsSupport(ExtendedRCEncoderContext *rcEnc);
+    void queryAndSetVulkanNullOptionalStringsSupport(ExtendedRCEncoderContext *rcEnc);
 
 private:
     IOStream *m_stream;
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index a5f1f89..dd73ca6 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -315,13 +315,13 @@
         ALOGE("vulkan: Failed to get renderControl encoder context\n"); \
         return ret; \
     } \
+    goldfish_vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const()); \
+    auto hostSupportsVulkan = goldfish_vk::ResourceTracker::get()->hostSupportsVulkan(); \
     goldfish_vk::VkEncoder *vkEnc = hostCon->vkEncoder(); \
     if (!vkEnc) { \
         ALOGE("vulkan: Failed to get Vulkan encoder\n"); \
         return ret; \
     } \
-    goldfish_vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const()); \
-    auto hostSupportsVulkan = goldfish_vk::ResourceTracker::get()->hostSupportsVulkan(); \
 
 VKAPI_ATTR
 VkResult EnumerateInstanceExtensionProperties(
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index bf8a928..d3bd3ff 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -563,6 +563,10 @@
             }
         }
 #endif
+
+        if (mFeatureInfo->hasVulkanNullOptionalStrings) {
+            mStreamFeatureBits |= VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT;
+        }
     }
 
     bool hostSupportsVulkan() const {
@@ -575,6 +579,10 @@
         return mHostVisibleMemoryVirtInfo.virtualizationSupported;
     }
 
+    uint32_t getStreamFeatures() const {
+        return mStreamFeatureBits;
+    }
+
     bool supportsDeferredCommands() const {
         if (!mFeatureInfo) return false;
         return mFeatureInfo->hasDeferredVulkanCommands;
@@ -3172,6 +3180,7 @@
     mutable Lock mLock;
     HostVisibleMemoryVirtualizationInfo mHostVisibleMemoryVirtInfo;
     std::unique_ptr<EmulatorFeatureInfo> mFeatureInfo;
+    uint32_t mStreamFeatureBits = 0;
     std::unique_ptr<GoldfishAddressSpaceBlockProvider> mGoldfishAddressSpaceBlockProvider;
 
     std::vector<VkExtensionProperties> mHostInstanceExtensions;
@@ -3252,6 +3261,10 @@
     return mImpl->usingDirectMapping();
 }
 
+uint32_t ResourceTracker::getStreamFeatures() const {
+    return mImpl->getStreamFeatures();
+}
+
 uint32_t ResourceTracker::getApiVersionFromInstance(VkInstance instance) const {
     return mImpl->getApiVersionFromInstance(instance);
 }
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 6429d6f..0f26c46 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -349,6 +349,7 @@
     void setupFeatures(const EmulatorFeatureInfo* features);
     bool hostSupportsVulkan() const;
     bool usingDirectMapping() const;
+    uint32_t getStreamFeatures() const;
     uint32_t getApiVersionFromInstance(VkInstance instance) const;
     uint32_t getApiVersionFromDevice(VkDevice device) const;
     bool hasInstanceExtension(VkInstance instance, const std::string& name) const;
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index 3b3cd9b..1048141 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -944,10 +944,17 @@
     }
     countingStream->rewind();
     {
-        // WARNING PTR CHECK
-        uint64_t cgen_var_53 = (uint64_t)(uintptr_t)local_pLayerName;
-        countingStream->putBe64(cgen_var_53);
-        if (local_pLayerName)
+        if (countingStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+        {
+            // WARNING PTR CHECK
+            uint64_t cgen_var_53 = (uint64_t)(uintptr_t)local_pLayerName;
+            countingStream->putBe64(cgen_var_53);
+            if (local_pLayerName)
+            {
+                countingStream->putString(local_pLayerName);
+            }
+        }
+        else
         {
             countingStream->putString(local_pLayerName);
         }
@@ -974,10 +981,17 @@
     uint32_t opcode_vkEnumerateInstanceExtensionProperties = OP_vkEnumerateInstanceExtensionProperties;
     stream->write(&opcode_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
     stream->write(&packetSize_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
-    // WARNING PTR CHECK
-    uint64_t cgen_var_56 = (uint64_t)(uintptr_t)local_pLayerName;
-    stream->putBe64(cgen_var_56);
-    if (local_pLayerName)
+    if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_56 = (uint64_t)(uintptr_t)local_pLayerName;
+        stream->putBe64(cgen_var_56);
+        if (local_pLayerName)
+        {
+            stream->putString(local_pLayerName);
+        }
+    }
+    else
     {
         stream->putString(local_pLayerName);
     }
@@ -1067,10 +1081,17 @@
         uint64_t cgen_var_61;
         countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_61, 1);
         countingStream->write((uint64_t*)&cgen_var_61, 1 * 8);
-        // WARNING PTR CHECK
-        uint64_t cgen_var_62 = (uint64_t)(uintptr_t)local_pLayerName;
-        countingStream->putBe64(cgen_var_62);
-        if (local_pLayerName)
+        if (countingStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+        {
+            // WARNING PTR CHECK
+            uint64_t cgen_var_62 = (uint64_t)(uintptr_t)local_pLayerName;
+            countingStream->putBe64(cgen_var_62);
+            if (local_pLayerName)
+            {
+                countingStream->putString(local_pLayerName);
+            }
+        }
+        else
         {
             countingStream->putString(local_pLayerName);
         }
@@ -1100,10 +1121,17 @@
     uint64_t cgen_var_65;
     stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_65, 1);
     stream->write((uint64_t*)&cgen_var_65, 1 * 8);
-    // WARNING PTR CHECK
-    uint64_t cgen_var_66 = (uint64_t)(uintptr_t)local_pLayerName;
-    stream->putBe64(cgen_var_66);
-    if (local_pLayerName)
+    if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_66 = (uint64_t)(uintptr_t)local_pLayerName;
+        stream->putBe64(cgen_var_66);
+        if (local_pLayerName)
+        {
+            stream->putString(local_pLayerName);
+        }
+    }
+    else
     {
         stream->putString(local_pLayerName);
     }
diff --git a/system/vulkan_enc/VulkanStreamGuest.cpp b/system/vulkan_enc/VulkanStreamGuest.cpp
index bbb5437..d6ebf50 100644
--- a/system/vulkan_enc/VulkanStreamGuest.cpp
+++ b/system/vulkan_enc/VulkanStreamGuest.cpp
@@ -14,6 +14,7 @@
 #include "VulkanStreamGuest.h"
 
 #include "IOStream.h"
+#include "ResourceTracker.h"
 
 #include "android/base/Pool.h"
 #include "android/base/Tracing.h"
@@ -27,7 +28,10 @@
 
 class VulkanStreamGuest::Impl : public android::base::Stream {
 public:
-    Impl(IOStream* stream) : mStream(stream) { unsetHandleMapping(); }
+    Impl(IOStream* stream) : mStream(stream) {
+        unsetHandleMapping();
+        mFeatureBits = ResourceTracker::get()->getStreamFeatures();
+    }
 
     ~Impl() { }
 
@@ -77,6 +81,10 @@
         commitWrite();
     }
 
+    uint32_t getFeatureBits() const {
+        return mFeatureBits;
+    }
+
 private:
     size_t oustandingWriteBuffer() const {
         return mWritePos;
@@ -107,6 +115,7 @@
     IOStream* mStream = nullptr;
     DefaultHandleMapping mDefaultHandleMapping;
     VulkanHandleMapping* mCurrentHandleMapping;
+    uint32_t mFeatureBits = 0;
 };
 
 VulkanStreamGuest::VulkanStreamGuest(IOStream *stream) :
@@ -178,6 +187,10 @@
     mImpl->flush();
 }
 
+uint32_t VulkanStreamGuest::getFeatureBits() const {
+    return mImpl->getFeatureBits();
+}
+
 VulkanCountingStream::VulkanCountingStream() : VulkanStreamGuest(nullptr) { }
 VulkanCountingStream::~VulkanCountingStream() = default;
 
diff --git a/system/vulkan_enc/VulkanStreamGuest.h b/system/vulkan_enc/VulkanStreamGuest.h
index 8fa4aaa..d70b9fb 100644
--- a/system/vulkan_enc/VulkanStreamGuest.h
+++ b/system/vulkan_enc/VulkanStreamGuest.h
@@ -16,6 +16,8 @@
 #include "android/base/files/Stream.h"
 #include "android/base/files/StreamSerializing.h"
 
+#include "goldfish_vk_private_defs.h"
+
 #include "VulkanHandleMapping.h"
 
 #include <memory>
@@ -51,6 +53,9 @@
     VulkanHandleMapping* handleMapping() const;
 
     void flush();
+
+    uint32_t getFeatureBits() const;
+
 private:
     class Impl;
     std::unique_ptr<Impl> mImpl;
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 6b88092..80afa5f 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -52,18 +52,32 @@
         vkStream->write((const void*)forMarshaling->pNext, sizeof(VkStructureType));
         marshal_extension_struct(vkStream, forMarshaling->pNext);
     }
-    // WARNING PTR CHECK
-    uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pApplicationName;
-    vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pApplicationName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pApplicationName;
+        vkStream->putBe64(cgen_var_0);
+        if (forMarshaling->pApplicationName)
+        {
+            vkStream->putString(forMarshaling->pApplicationName);
+        }
+    }
+    else
     {
         vkStream->putString(forMarshaling->pApplicationName);
     }
     vkStream->write((uint32_t*)&forMarshaling->applicationVersion, sizeof(uint32_t));
-    // WARNING PTR CHECK
-    uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pEngineName;
-    vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pEngineName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pEngineName;
+        vkStream->putBe64(cgen_var_1);
+        if (forMarshaling->pEngineName)
+        {
+            vkStream->putString(forMarshaling->pEngineName);
+        }
+    }
+    else
     {
         vkStream->putString(forMarshaling->pEngineName);
     }
@@ -84,27 +98,41 @@
         vkStream->read((void*)(&pNext_placeholder), sizeof(VkStructureType));
         unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
     }
-    // WARNING PTR CHECK
-    const char* check_pApplicationName;
-    check_pApplicationName = (const char*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pApplicationName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
-        if (!(check_pApplicationName))
+        // WARNING PTR CHECK
+        const char* check_pApplicationName;
+        check_pApplicationName = (const char*)(uintptr_t)vkStream->getBe64();
+        if (forUnmarshaling->pApplicationName)
         {
-            fprintf(stderr, "fatal: forUnmarshaling->pApplicationName inconsistent between guest and host\n");
+            if (!(check_pApplicationName))
+            {
+                fprintf(stderr, "fatal: forUnmarshaling->pApplicationName inconsistent between guest and host\n");
+            }
+            vkStream->loadStringInPlace((char**)&forUnmarshaling->pApplicationName);
         }
+    }
+    else
+    {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pApplicationName);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->applicationVersion, sizeof(uint32_t));
-    // WARNING PTR CHECK
-    const char* check_pEngineName;
-    check_pEngineName = (const char*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pEngineName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
-        if (!(check_pEngineName))
+        // WARNING PTR CHECK
+        const char* check_pEngineName;
+        check_pEngineName = (const char*)(uintptr_t)vkStream->getBe64();
+        if (forUnmarshaling->pEngineName)
         {
-            fprintf(stderr, "fatal: forUnmarshaling->pEngineName inconsistent between guest and host\n");
+            if (!(check_pEngineName))
+            {
+                fprintf(stderr, "fatal: forUnmarshaling->pEngineName inconsistent between guest and host\n");
+            }
+            vkStream->loadStringInPlace((char**)&forUnmarshaling->pEngineName);
         }
+    }
+    else
+    {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pEngineName);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->engineVersion, sizeof(uint32_t));
@@ -11590,10 +11618,17 @@
     }
     vkStream->write((VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
     vkStream->write((uint64_t*)&forMarshaling->objectHandle, sizeof(uint64_t));
-    // WARNING PTR CHECK
-    uint64_t cgen_var_334 = (uint64_t)(uintptr_t)forMarshaling->pObjectName;
-    vkStream->putBe64(cgen_var_334);
-    if (forMarshaling->pObjectName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_334 = (uint64_t)(uintptr_t)forMarshaling->pObjectName;
+        vkStream->putBe64(cgen_var_334);
+        if (forMarshaling->pObjectName)
+        {
+            vkStream->putString(forMarshaling->pObjectName);
+        }
+    }
+    else
     {
         vkStream->putString(forMarshaling->pObjectName);
     }
@@ -11614,15 +11649,22 @@
     }
     vkStream->read((VkObjectType*)&forUnmarshaling->objectType, sizeof(VkObjectType));
     vkStream->read((uint64_t*)&forUnmarshaling->objectHandle, sizeof(uint64_t));
-    // WARNING PTR CHECK
-    const char* check_pObjectName;
-    check_pObjectName = (const char*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pObjectName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
-        if (!(check_pObjectName))
+        // WARNING PTR CHECK
+        const char* check_pObjectName;
+        check_pObjectName = (const char*)(uintptr_t)vkStream->getBe64();
+        if (forUnmarshaling->pObjectName)
         {
-            fprintf(stderr, "fatal: forUnmarshaling->pObjectName inconsistent between guest and host\n");
+            if (!(check_pObjectName))
+            {
+                fprintf(stderr, "fatal: forUnmarshaling->pObjectName inconsistent between guest and host\n");
+            }
+            vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
         }
+    }
+    else
+    {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
     }
 }
@@ -11713,10 +11755,17 @@
         marshal_extension_struct(vkStream, forMarshaling->pNext);
     }
     vkStream->write((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
-    // WARNING PTR CHECK
-    uint64_t cgen_var_338 = (uint64_t)(uintptr_t)forMarshaling->pMessageIdName;
-    vkStream->putBe64(cgen_var_338);
-    if (forMarshaling->pMessageIdName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_338 = (uint64_t)(uintptr_t)forMarshaling->pMessageIdName;
+        vkStream->putBe64(cgen_var_338);
+        if (forMarshaling->pMessageIdName)
+        {
+            vkStream->putString(forMarshaling->pMessageIdName);
+        }
+    }
+    else
     {
         vkStream->putString(forMarshaling->pMessageIdName);
     }
@@ -11771,15 +11820,22 @@
         unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
-    // WARNING PTR CHECK
-    const char* check_pMessageIdName;
-    check_pMessageIdName = (const char*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pMessageIdName)
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
-        if (!(check_pMessageIdName))
+        // WARNING PTR CHECK
+        const char* check_pMessageIdName;
+        check_pMessageIdName = (const char*)(uintptr_t)vkStream->getBe64();
+        if (forUnmarshaling->pMessageIdName)
         {
-            fprintf(stderr, "fatal: forUnmarshaling->pMessageIdName inconsistent between guest and host\n");
+            if (!(check_pMessageIdName))
+            {
+                fprintf(stderr, "fatal: forUnmarshaling->pMessageIdName inconsistent between guest and host\n");
+            }
+            vkStream->loadStringInPlace((char**)&forUnmarshaling->pMessageIdName);
         }
+    }
+    else
+    {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pMessageIdName);
     }
     vkStream->read((int32_t*)&forUnmarshaling->messageIdNumber, sizeof(int32_t));
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index 35d4425..3607967 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -523,6 +523,9 @@
     ((VkExternalSemaphoreHandleTypeFlagBits)0x00100000)
 #endif  // VK_FUCHSIA_external_semaphore
 
+// VulkanStream features
+#define VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT (1 << 0)
+
 #ifdef __cplusplus
 } // extern "C"
 #endif