From eec4f9b8c3ea0eb6dd6e044d04c4ec1c4d6c01df Mon Sep 17 00:00:00 2001 From: Puyan Lotfi Date: Mon, 14 Oct 2019 18:03:03 +0000 Subject: [PATCH] [clang][IFS] Escape mangled names so MS ABI doesn't break YAML parsing. Microsoft's ABI mangles names differently than Itanium and this breaks the LLVM yaml parser unless the name is escaped in quotes. Quotes are being added to the mangled names of the IFS file generation so that llvm-ifs doesn't break when Windows triples are passed to the driver. Differential Revision: https://reviews.llvm.org/D68915 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@374798 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Frontend/InterfaceStubFunctionsConsumer.cpp | 4 ++-- test/InterfaceStubs/inline.c | 4 ++-- test/InterfaceStubs/object.c | 2 +- test/InterfaceStubs/windows.cpp | 7 +++++++ 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 test/InterfaceStubs/windows.cpp diff --git a/lib/Frontend/InterfaceStubFunctionsConsumer.cpp b/lib/Frontend/InterfaceStubFunctionsConsumer.cpp index 5ce7a36ac9..0b28b78de3 100644 --- a/lib/Frontend/InterfaceStubFunctionsConsumer.cpp +++ b/lib/Frontend/InterfaceStubFunctionsConsumer.cpp @@ -263,11 +263,11 @@ public: for (const auto &E : Symbols) { const MangledSymbol &Symbol = E.second; for (auto Name : Symbol.Names) { - OS << " " + OS << " \"" << (Symbol.ParentName.empty() || Instance.getLangOpts().CPlusPlus ? "" : (Symbol.ParentName + ".")) - << Name << ": { Type: "; + << Name << "\" : { Type: "; switch (Symbol.Type) { default: llvm_unreachable( diff --git a/test/InterfaceStubs/inline.c b/test/InterfaceStubs/inline.c index 06a58c4c1b..6f0cb519ca 100644 --- a/test/InterfaceStubs/inline.c +++ b/test/InterfaceStubs/inline.c @@ -56,8 +56,8 @@ INLINE int foo() { // RUN: -c -std=gnu89 -xc %s | llvm-nm - 2>&1 | \ // RUN: FileCheck -check-prefix=CHECK-SYMBOLS %s -// CHECK-TAPI-DAG: foo: { Type: Func } -// CHECK-TAPI-DAG: foo.var: { Type: Object, Size: 4 } +// CHECK-TAPI-DAG: "foo" : { Type: Func } +// CHECK-TAPI-DAG: "foo.var" : { Type: Object, Size: 4 } // CHECK-SYMBOLS-DAG: foo // CHECK-SYMBOLS-DAG: foo.var #include "inline.h" diff --git a/test/InterfaceStubs/object.c b/test/InterfaceStubs/object.c index 774b79ddec..0687e2c811 100644 --- a/test/InterfaceStubs/object.c +++ b/test/InterfaceStubs/object.c @@ -2,6 +2,6 @@ // RUN: %clang -fvisibility=default -c -o - -emit-interface-stubs %s | FileCheck -check-prefix=CHECK-SYMBOLS %s // RUN: %clang -fvisibility=default -c -o - %s | llvm-nm - 2>&1 | FileCheck -check-prefix=CHECK-SYMBOLS %s -// CHECK-TAPI: data: { Type: Object, Size: 4 } +// CHECK-TAPI: "data" : { Type: Object, Size: 4 } // CHECK-SYMBOLS: data int data = 42; diff --git a/test/InterfaceStubs/windows.cpp b/test/InterfaceStubs/windows.cpp new file mode 100644 index 0000000000..5bf5a688e1 --- /dev/null +++ b/test/InterfaceStubs/windows.cpp @@ -0,0 +1,7 @@ +// REQUIRES: x86-registered-target +// RUN: %clang -target x86_64-windows-msvc -o - %s \ +// RUN: -emit-interface-stubs -emit-merged-ifs | FileCheck %s + +// CHECK: Symbols: +// CHECK-NEXT: ?helloWindowsMsvc@@YAHXZ +int helloWindowsMsvc(); -- 2.40.0