brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · 6790d70 Raw
247 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// This test is too big for most embedded devices.10// XFAIL: LIBCXX-PICOLIBC-FIXME11 12// This test exercises support for char array initializer lists added in13// dd8b266ef.14// UNSUPPORTED: using-built-library-before-llvm-2015 16// This test exercises support for BitInt demangling introduced in17// 20f56d140909a01c74e9981835373eaab6021af9.18// UNSUPPORTED: using-built-library-before-llvm-2119 20// XFAIL: win32-broken-printf-a-precision21 22#include "support/timer.h"23#include <algorithm>24#include <cassert>25#include <cstdio>26#include <cstdlib>27#include <cstring>28#include <cxxabi.h>29#include <string>30 31// Is long double fp80?  (Only x87 extended double has 64-bit mantissa)32#define LDBL_FP80 (__LDBL_MANT_DIG__ == 64)33// Is long double fp128?34#define LDBL_FP128 (__LDBL_MANT_DIG__ == 113)35 36const char* cases[][2] = {37#include "DemangleTestCases.inc"38};39 40const unsigned N = sizeof(cases) / sizeof(cases[0]);41 42struct FPLiteralCase {43  const char* mangled;44  // There are four possible demanglings of a given float.45  std::string expecting[4];46} fp_literal_cases[] = {47    // clang-format off48    {"_ZN5test01gIfEEvRAszplcvT__ELf40a00000E_c",49     {50         "void test0::g<float>(char (&) [sizeof ((float)() + 0x1.4p+2f)])",51         "void test0::g<float>(char (&) [sizeof ((float)() + 0x2.8p+1f)])",52         "void test0::g<float>(char (&) [sizeof ((float)() + 0x5p+0f)])",53         "void test0::g<float>(char (&) [sizeof ((float)() + 0xap-1f)])",54     }},55    {"_ZN5test01hIfEEvRAszplcvT__ELd4014000000000000E_c",56     {57         "void test0::h<float>(char (&) [sizeof ((float)() + 0x1.4p+2)])",58         "void test0::h<float>(char (&) [sizeof ((float)() + 0x2.8p+1)])",59         "void test0::h<float>(char (&) [sizeof ((float)() + 0x5p+0)])",60         "void test0::h<float>(char (&) [sizeof ((float)() + 0xap-1)])",61     }},62#if LDBL_FP8063    {"_ZN5test01hIfEEvRAcvjplstT_Le4001a000000000000000E_c",64     {65         "void test0::h<float>(char (&) [(unsigned int)(sizeof (float) + 0x1.4p+2L)])",66         "void test0::h<float>(char (&) [(unsigned int)(sizeof (float) + 0x2.8p+1L)])",67         "void test0::h<float>(char (&) [(unsigned int)(sizeof (float) + 0x5p+0L)])",68         "void test0::h<float>(char (&) [(unsigned int)(sizeof (float) + 0xap-1L)])",69     }},70#endif71#if LDBL_FP12872    // A 32-character FP literal of long double type73    {"3FooILeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeEE",74     {"Foo<-0x1.eeeeeeeeeeeeeeeeeeeeeeeeeeeep+12015L>"}},75#endif76    // clang-format on77};78const unsigned NF = sizeof(fp_literal_cases) / sizeof(fp_literal_cases[0]);79const unsigned NEF = sizeof(fp_literal_cases[0].expecting) / sizeof(fp_literal_cases[0].expecting[0]);80 81const char* invalid_cases[] = {82    // clang-format off83    "_ZIPPreEncode",84    "Agentt",85    "NSoERj5E=Y1[uM:ga",86    "Aon_PmKVPDk7?fg4XP5smMUL6;<WsI_mgbf23cCgsHbT<l8EE\0uVRkNOoXDrgdA4[8IU>Vl<>IL8ayHpiVDDDXTY;^o9;i",87    "_ZNSt16allocator_traitsISaIN4llvm3sys2fs18directory_iteratorEEE9constructIS3_IS3_EEEDTcl12_S_constructfp_fp0_spcl7forwardIT0_Efp1_EEERS4_PT_DpOS7_",88    "3FooILdaaaaaaaaaaAAAAaaEE",89    "3FooILdaaaaaaaaaaaaaaEE",90#if !LDBL_FP8091    "_ZN5test01hIfEEvRAcvjplstT_Le4001a000000000000000E_c",92#endif93    // The following test cases were found by libFuzzer+ASAN94    "\x44\x74\x70\x74\x71\x75\x34\x43\x41\x72\x4D\x6E\x65\x34\x9F\xC1\x43\x41\x72\x4D\x6E\x77\x38\x9A\x8E\x44\x6F\x64\x6C\x53\xF9\x5F\x70\x74\x70\x69\x45\x34\xD3\x73\x9E\x2A\x37",95    "\x4D\x41\x72\x63\x4E\x39\x44\x76\x72\x4D\x34\x44\x53\x4B\x6F\x44\x54\x6E\x61\x37\x47\x77\x78\x38\x43\x27\x41\x5F\x73\x70\x69\x45*",96    "\x41\x64\x6E\x32*",97    "\x43\x46\x41\x67\x73*",98    "\x72\x3A\x4E\x53\x64\x45\x39\x4F\x52\x4E\x1F\x43\x34\x64\x54\x5F\x49\x31\x41\x63\x6C\x37\x2A\x4D\x41\x67\x73\x76\x43\x54\x35\x5F\x49\x4B\x4C\x55\x6C\x73\x4C\x38\x64\x43\x41\x47\x4C\x5A\x28\x4F\x41\x6E\x77\x5F\x53\x6F\x70\x69\x45\x5F\x63\x47\x61\x4C\x31\x4F\x4C\x33\x3E\x41\x4C\x4B\x4C\x55\x6C\x73\x4C\x38\x64\x43\x66\x41\x47\x4C\x5A\x28\x4F\x41\x6E\x77\x5F\x53\x6F\x70\x69\x45\x5F\x37\x41*",99    "\x2D\x5F\x63\x47\x4F\x63\xD3",100    "\x44\x74\x70\x74\x71\x75\x32\x43\x41\x38\x65\x6E\x9B\x72\x4D\xC1\x43\x41\x72\x4D\x6E\x77\x38\x9A\x8E\x44\x6F\x64\xC3\x53\xF9\x5F\x70\x74\x70\x69\x45\x38\xD3\x73\x9E\x2A\x37",101    "\x4C\x5A\x4C\x55\x6C\x4D\x41\x5F\x41\x67\x74\x71\x75\x34\x4D\x41\x64\x73\x4C\x44\x76\x72\x4D\x34\x44\x4B\x44\x54\x6E\x61\x37\x47\x77\x78\x38\x43\x27\x41\x5F\x73\x70\x69\x45\x6D\x73\x72\x53\x41\x6F\x41\x7B",102    "\x44\x74\x70\x74\x71\x75\x32\x43\x41\x38\x65\x6E\x9B\x72\x4D\xC1\x43\x41\x72\x4D\x6E\x77\x38\x9A\x8E\x44\x6F\x64\x2C\x53\xF9\x5F\x70\x74\x70\x69\x45\xB4\xD3\x73\x9F\x2A\x37",103    "\x4C\x5A\x4C\x55\x6C\x69\x4D\x73\x72\x53\x6F\x7A\x41\x5F\x41\x67\x74\x71\x75\x32\x4D\x41\x64\x73\x39\x28\x76\x72\x4D\x34\x44\x4B\x45\x54\x6E\x61\x37\x47\x77\x78\x38\x43\x27\x41\x5F\x73\x70\x69\x45\x6F\x45\x49\x6D\x1A\x4C\x53\x38\x6A\x7A\x5A",104    "\x44\x74\x63*",105    "\x44\x74\x71\x75\x35\x2A\xDF\x74\x44\x61\x73\x63\x35\x2A\x3B\x41\x72\x4D\x6E\x65\x34\x9F\xC1\x63\x41\x72\x4D\x6E\x77\x38\x9A\x8E\x44\x6F\x64\x6C\x53\xF9\x5F\x70\x74\x70\x69\x45\x33\x44\x76\x35",106    "\x44\x74\x70\x74\x71\x75\x32\x43\x41\x38\x65\x6E\x9B\x72\x4D\xC1\x43\x41\x72\x4D\x6E\x77\x38\x9A\x8E\x44\x6F\x64\x6C\x53\xF9\x5F\x70\x74\x70\x69\x45\x38\xD3\x73\x9E\x2A\x37",107    "\x46\x44\x74\x70\x74\x71\x75\x32\x43\x41\x72\x4D\x6E\x65\x34\x9F\xC1\x43\x41\x72\x4D\x6E\x77\x38\x9A\x8E\x44\x6F\x64\x6C\x53\xF9\x5F\x70\x74\x70\x69\x45\x34\xD3\x73\x9E\x2A\x37\x72\x33\x8E\x3A\x29\x8E\x44\x35",108    "_ZcvCiIJEEDvT__FFFFT_vT_v",109    "Z1JIJ1_T_EE3o00EUlT_E0",110    "___Z2i_D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D",111    "ZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIDv_ZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIDv_ZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIDv_Dv_Dv_Dv_Dv_dZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIDv_ZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIDv_ZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIZcvSdIDv_Dv_Dv_Dv_Dv_d",112    "Z1 Z1 IJEEAcvZcvT_EcvT_T_",113    "T_IZaaIJEEAnaaaT_T__",114    "PT_IJPNT_IJEET_T_T_T_)J)JKE",115    "1 IJEVNT_T_T_EE",116    "AT__ZSiIJEEAnwscT_T__",117    "FSiIJEENT_IoE ",118    "ZTVSiIZTVSiIZTVSiIZTVSiINIJEET_T_T_T_T_ ",119    "Ana_T_E_T_IJEffffffffffffffersfffffrsrsffffffbgE",120 121    "_ZN3TPLS_E",122    "_ZN3CLSIiEIiEE",123    "_ZN3CLSDtLi0EEE",124    "_ZN3CLSIiEEvNS_T_Ev",125 126    "_ZN1fIiEEvNTUt_E",127    "_ZNDTUt_Ev",128 129    "_Z1fIXfLpt1x1yEEvv",130    "_Z1fIXfLdt1x1yEEvv",131 132    "_ZN1fIXawLi0EEEEvv",133 134    "_ZNWUt_3FOOEv",135    "_ZWDC3FOOEv",136    "_ZGI3Foo",137    "_ZGIW3Foov",138    "W1x",139    // clang-format on140};141 142const unsigned NI = sizeof(invalid_cases) / sizeof(invalid_cases[0]);143 144void test() {145  std::size_t len = 0;146  char *buf = nullptr;147  bool failed = false;148  for (unsigned i = 0; i < N; ++i) {149    int status;150    char* demang = __cxxabiv1::__cxa_demangle(cases[i][0], buf, &len, &status);151    if (!demang || std::strcmp(demang, cases[i][1]) != 0) {152      std::fprintf(stderr,153                   "ERROR demangling %s\n"154                   "expected: %s\n"155                   "got: %d,   %s\n",156                   cases[i][0], cases[i][1], status, demang ? demang : "(null)");157      failed = true;158    }159    if (demang)160      buf = demang;161  }162  free(buf);163  assert(!failed && "demangle failed");164}165 166void test_invalid_cases() {167  std::size_t len = 0;168  char *buf = nullptr;169  bool passed = false;170  for (unsigned i = 0; i < NI; ++i) {171    int status;172    char* demang = __cxxabiv1::__cxa_demangle(invalid_cases[i], buf, &len, &status);173    if (status != -2) {174      std::printf("%s should be invalid but is not\n", invalid_cases[i]);175      std::printf("Got: %d, %s\n", status, demang ? demang : "(null)");176      passed = true;177    }178    if (demang)179      buf = demang;180  }181  free(buf);182  assert(!passed && "demangle did not fail");183}184 185const char* const xfail_cases[] = {186    // Sentinel value187    nullptr,188};189 190void test_xfail_cases() {191  std::size_t len = 0;192  char* buf = nullptr;193  for (const char* c_str : xfail_cases) {194    if (!c_str)195      break;196    int status;197    char* demang = __cxxabiv1::__cxa_demangle(c_str, buf, &len, &status);198    if (status != -2) {199      std::printf("%s was documented as xfail but passed\n", c_str);200      std::printf("Got status = %d\n", status);201      assert(status == -2);202    } else {203      buf = demang;204    }205  }206  free(buf);207}208 209void testFPLiterals() {210  std::size_t len = 0;211  char* buf = nullptr;212  for (unsigned i = 0; i < NF; ++i) {213    FPLiteralCase* fpCase = fp_literal_cases + i;214    int status;215    char* demang = __cxxabiv1::__cxa_demangle(fpCase->mangled, buf, &len, &status);216    if (demang == 0) {217      std::printf("%s -> %s\n", fpCase->mangled, fpCase->expecting[0].c_str());218      std::printf("Got instead: NULL, %d\n", status);219      assert(false);220      continue;221    }222    std::string* e_beg = fpCase->expecting;223    std::string* e_end = fpCase->expecting + NEF;224    if (std::find(e_beg, e_end, demang) == e_end) {225      std::printf("%s -> %s\n", fpCase->mangled, fpCase->expecting[0].c_str());226      std::printf("Got instead: %s\n", demang);227      assert(false);228      continue;229    }230    buf = demang;231  }232  free(buf);233}234 235int main(int, char**) {236  std::printf("Testing %d symbols.\n", N);237  {238    timer t;239    test();240    test_invalid_cases();241    test_xfail_cases();242    testFPLiterals();243  }244 245  return 0;246}247