Introduce GFXSTREAM_ABORT instead of normal abort.

This CL moves most of our abort() callsites to use the new
GFXSTREAM_ABORT macro, which will allow us to track metrics
about when and where we abort.

Generated code is not yet changed, and test and third-party
code is not affected.

Bug: 204125485
Test: Compile, run emulator.

Change-Id: I909d79a35121f24a60e3b4db2745af5ceeee369c
diff --git a/stream-servers/vulkan/VkAndroidNativeBuffer.cpp b/stream-servers/vulkan/VkAndroidNativeBuffer.cpp
index 9f92bcf..4a8f363 100644
--- a/stream-servers/vulkan/VkAndroidNativeBuffer.cpp
+++ b/stream-servers/vulkan/VkAndroidNativeBuffer.cpp
@@ -15,6 +15,7 @@
 #include "cereal/common/goldfish_vk_private_defs.h"
 #include "cereal/common/goldfish_vk_extension_structs.h"
 
+#include "host-common/GfxstreamFatalError.h"
 #include "stream-servers/FrameBuffer.h"
 #include "GrallocDefs.h"
 #include "VkCommonOperations.h"
diff --git a/stream-servers/vulkan/VkCommonOperations.cpp b/stream-servers/vulkan/VkCommonOperations.cpp
index fc95906..330324f 100644
--- a/stream-servers/vulkan/VkCommonOperations.cpp
+++ b/stream-servers/vulkan/VkCommonOperations.cpp
@@ -34,6 +34,7 @@
 #include "base/System.h"
 #include "base/Tracing.h"
 #include "common/goldfish_vk_dispatch.h"
+#include "host-common/GfxstreamFatalError.h"
 #include "host-common/vm_operations.h"
 
 #ifdef _WIN32
@@ -792,7 +793,6 @@
 
     sVkEmulation->physdev = physdevs[maxScoringIndex];
     sVkEmulation->deviceInfo = deviceInfos[maxScoringIndex];
-
     // Postcondition: sVkEmulation has valid device support info
 
     // Ask about image format support here.
@@ -1876,7 +1876,6 @@
     bool readRes = FrameBuffer::getFB()->
         readColorBufferContents(
             colorBufferHandle, &cbNumBytes, nullptr);
-
     if (!readRes) {
         fprintf(stderr, "%s: Failed to read color buffer 0x%x\n",
                 __func__, colorBufferHandle);
@@ -2008,7 +2007,7 @@
             });
         }
     }
-        
+
     vk->vkCmdCopyBufferToImage(
         sVkEmulation->commandBuffer,
         sVkEmulation->staging.buffer,
@@ -2469,8 +2468,8 @@
         if (res == VK_NOT_READY) {
             continue;
         }
-        VK_COMMON_ERROR("Invalid fence state: %d", static_cast<int>(res));
-        ::std::abort();
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+            << "Invalid fence state: " << static_cast<int>(res);
     }
     VkCommandBuffer commandBuffer;
     VkCommandBufferAllocateInfo allocateInfo = {
@@ -2504,9 +2503,7 @@
 void acquireColorBuffersForHostComposing(const std::vector<uint32_t>& layerColorBuffers,
                                          uint32_t renderTargetColorBuffer) {
     if (!sVkEmulation || !sVkEmulation->live) {
-        VK_COMMON_ERROR("Host Vulkan device lost.");
-        ::std::abort();
-        return;
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost";
     }
 
     std::vector<std::tuple<uint32_t, VkImageLayout>> colorBuffersAndLayouts;
@@ -2647,9 +2644,7 @@
 static VkFence doReleaseColorBufferForGuestRendering(
     const std::vector<uint32_t>& colorBufferHandles) {
     if (!sVkEmulation || !sVkEmulation->live) {
-        VK_COMMON_ERROR("Host Vulkan device lost.");
-        ::std::abort();
-        return VK_NULL_HANDLE;
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost";
     }
 
     AutoLock lock(sVkEmulationLock);
@@ -2772,9 +2767,7 @@
 void releaseColorBufferFromHostComposingSync(const std::vector<uint32_t>& colorBufferHandles) {
     VkFence fence = doReleaseColorBufferForGuestRendering(colorBufferHandles);
     if (!sVkEmulation || !sVkEmulation->live) {
-        VK_COMMON_ERROR("Host Vulkan device lost.");
-        ::std::abort();
-        return;
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost";
     }
 
     AutoLock lock(sVkEmulationLock);
diff --git a/stream-servers/vulkan/VkDecoderGlobalState.cpp b/stream-servers/vulkan/VkDecoderGlobalState.cpp
index d480316..24139fc 100644
--- a/stream-servers/vulkan/VkDecoderGlobalState.cpp
+++ b/stream-servers/vulkan/VkDecoderGlobalState.cpp
@@ -44,6 +44,7 @@
 #include "common/goldfish_vk_deepcopy.h"
 #include "common/goldfish_vk_dispatch.h"
 #include "host-common/address_space_device_control_ops.h"
+#include "host-common/GfxstreamFatalError.h"
 #include "host-common/vm_operations.h"
 #include "host-common/feature_control.h"
 #include "vk_util.h"
@@ -456,8 +457,8 @@
 
         if (m_emu->instanceSupportsMoltenVK) {
             if (!m_vk->vkSetMTLTextureMVK) {
-                fprintf(stderr, "Cannot find vkSetMTLTextureMVK\n");
-                abort();
+                GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) <<
+                        "Cannot find vkSetMTLTextureMVK";
             }
         }
 
@@ -3032,11 +3033,8 @@
             vk_find_struct<VkExportMemoryAllocateInfo>(pAllocateInfo);
 
         if (exportAllocInfoPtr) {
-            fprintf(stderr,
-                    "%s: Fatal: Export allocs are to be handled "
-                    "on the guest side / VkCommonOperations.\n",
-                    __func__);
-            abort();
+            GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) <<
+                "Export allocs are to be handled on the guest side / VkCommonOperations.";
         }
 
         const VkMemoryDedicatedAllocateInfo* dedicatedAllocInfoPtr =
@@ -4370,7 +4368,7 @@
                 currSi.pWaitSemaphores = pBindInfo[i].pWaitSemaphores;
                 waitDstStageMasks.resize(pBindInfo[i].waitSemaphoreCount, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
                 currSi.pWaitDstStageMask = waitDstStageMasks.data();
-                
+
                 currSi.signalSemaphoreCount = 0;
                 currSi.pSignalSemaphores = nullptr;
 
@@ -4515,8 +4513,8 @@
 
         auto poolInfo = android::base::find(mDescriptorPoolInfo, pool);
         if (!poolInfo) {
-            fprintf(stderr, "%s: FATAL: descriptor pool %p not found\n", __func__, pool);
-            abort();
+            GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+                << "descriptor pool " << pool << " not found ";
         }
 
         DispatchableHandleInfo<uint64_t>* setHandleInfo = sBoxedHandleManager.get(poolId);
@@ -4555,9 +4553,10 @@
                 *didAlloc = true;
                 return allocedSet;
             } else {
-                fprintf(stderr, "%s: FATAL: descriptor pool %p wanted to get set with id 0x%llx but it wasn't allocated\n", __func__,
-                        pool, (unsigned long long)poolId);
-                abort();
+                GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+                        << "descriptor pool " << pool << " wanted to get set with id 0x" <<
+                        std::hex << poolId;
+                return nullptr;
             }
         }
     }
@@ -4587,9 +4586,8 @@
         if (queueInfo) {
             device = queueInfo->device;
         } else {
-            fprintf(stderr, "%s: FATAL: queue %p (boxed: %p) with no device registered\n", __func__,
-                    queue, boxed_queue);
-            abort();
+            GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+                << "queue " << queue << "(boxed: " << boxed_queue << ") with no device registered";
         }
 
         std::vector<VkDescriptorSet> setsToUpdate(descriptorSetCount, nullptr);
@@ -6259,8 +6257,8 @@
             } else if (isDescriptorTypeBufferView(type)) {
                 numBufferViews += count;
             } else {
-                fprintf(stderr, "%s: fatal: unknown descriptor type 0x%x\n", __func__, type);
-                abort();
+                GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+                    << "unknown descriptor type 0x" << std::hex << type;
             }
         }
 
@@ -6303,8 +6301,8 @@
                 entryForHost.stride = sizeof(VkBufferView);
                 ++bufferViewCount;
             } else {
-                fprintf(stderr, "%s: fatal: unknown descriptor type 0x%x\n", __func__, type);
-                abort();
+                GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+                    << "unknown descriptor type 0x" << std::hex << type;
             }
 
             res.linearizedTemplateEntries.push_back(entryForHost);
diff --git a/stream-servers/vulkan/VulkanStream.cpp b/stream-servers/vulkan/VulkanStream.cpp
index 9529c10..7c326d4 100644
--- a/stream-servers/vulkan/VulkanStream.cpp
+++ b/stream-servers/vulkan/VulkanStream.cpp
@@ -18,6 +18,7 @@
 #include "base/BumpPool.h"
 
 #include "host-common/feature_control.h"
+#include "host-common/GfxstreamFatalError.h"
 
 #include <vector>
 
@@ -56,12 +57,12 @@
         *ptrAddr = nullptr;
         return;
     }
-    
+
     *ptrAddr = mPool.alloc(bytes);
 
     if (!*ptrAddr) {
-        fprintf(stderr, "%s: FATAL: alloc failed. Wanted size: %zu\n", __func__, bytes);
-        abort();
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) <<
+                "alloc failed. Wanted size: " << bytes;
     }
 }
 
@@ -99,10 +100,8 @@
     android::base::Stream::fromBe32((uint8_t*)&len);
 
     if (len == UINT32_MAX) {
-        fprintf(stderr,
-                "%s: FATAL: VulkanStream can't allocate %u bytes\n",
-                __func__, UINT32_MAX);
-        abort();
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) <<
+                "VulkanStream can't allocate UINT32_MAX bytes";
     }
 
     alloc((void**)forOutput, len + 1);
@@ -137,8 +136,8 @@
 ssize_t VulkanStream::read(void *buffer, size_t size) {
     commitWrite();
     if (!mStream->readFully(buffer, size)) {
-        E("FATAL: Could not read back %zu bytes", size);
-        abort();
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+            << "Could not read back " << size << " bytes";
     }
     return size;
 }
@@ -162,16 +161,16 @@
 
 void VulkanStream::commitWrite() {
     if (!valid()) {
-        E("FATAL: Tried to commit write to vulkan pipe with invalid pipe!");
-        abort();
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) <<
+                            "Tried to commit write to vulkan pipe with invalid pipe!";
     }
-    
+
     int written =
         mStream->writeFully(mWriteBuffer.data(), mWritePos);
-    
+
     if (written) {
-        E("FATAL: Did not write exactly %zu bytes!", mWritePos);
-        abort();
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+            << "Did not write exactly " << mWritePos << " bytes!";
     }
     mWritePos = 0;
 }
@@ -226,10 +225,8 @@
 }
 
 ssize_t VulkanMemReadingStream::write(const void* buffer, size_t size) {
-    fprintf(stderr,
-            "%s: FATAL: VulkanMemReadingStream does not support writing\n",
-            __func__);
-    abort();
+    GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) <<
+            "VulkanMemReadingStream does not support writing";
 }
 
 uint8_t* VulkanMemReadingStream::beginTrace() {
diff --git a/stream-servers/vulkan/vk_util.h b/stream-servers/vulkan/vk_util.h
index 92c0469..053f2e4 100644
--- a/stream-servers/vulkan/vk_util.h
+++ b/stream-servers/vulkan/vk_util.h
@@ -35,6 +35,8 @@
 
 #include "base/Lock.h"
 #include "common/vk_struct_id.h"
+#include "VkCommonOperations.h"
+#include "host-common/GfxstreamFatalError.h"
 
 struct vk_struct_common {
     VkStructureType sType;
@@ -267,9 +269,7 @@
     do {                                                                 \
         VkResult err = x;                                                \
         if (err != VK_SUCCESS) {                                         \
-            ::fprintf(stderr, "%s(%u) %s: %s failed, error code = %d\n", \
-                      __FILE__, __LINE__, __FUNCTION__, #x, err);        \
-            ::abort();                                                   \
+            GFXSTREAM_ABORT(FatalError(err));                            \
         }                                                                \
     } while (0)