[Mangle] Add flag to asm labels to disable '\01' prefixing
LLDB synthesizes decls using asm labels. These decls cannot have a mangle
different than the one specified in the label name. I.e., the '\01' prefix
should not be added.
Fixes an expression evaluation failure in lldb's TestVirtual.py on iOS.
rdar://45827323
Differential Revision: https://reviews.llvm.org/D67774
llvm-svn: 372903
diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp
index 6691952..b3bc064 100644
--- a/clang/unittests/AST/DeclTest.cpp
+++ b/clang/unittests/AST/DeclTest.cpp
@@ -10,12 +10,16 @@
//
//===----------------------------------------------------------------------===//
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Mangle.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Basic/LLVM.h"
#include "clang/Tooling/Tooling.h"
#include "gtest/gtest.h"
using namespace clang::ast_matchers;
using namespace clang::tooling;
+using namespace clang;
TEST(Decl, CleansUpAPValues) {
MatchFinder Finder;
@@ -56,3 +60,48 @@
"constexpr _Complex __uint128_t c = 0xffffffffffffffff;",
Args));
}
+
+TEST(Decl, AsmLabelAttr) {
+ // Create two method decls: `f` and `g`.
+ StringRef Code = R"(
+ struct S {
+ void f() {}
+ void g() {}
+ };
+ )";
+ auto AST =
+ tooling::buildASTFromCodeWithArgs(Code, {"-target", "i386-apple-darwin"});
+ ASTContext &Ctx = AST->getASTContext();
+ assert(Ctx.getTargetInfo().getDataLayout().getGlobalPrefix() &&
+ "Expected target to have a global prefix");
+ DiagnosticsEngine &Diags = AST->getDiagnostics();
+ SourceManager &SM = AST->getSourceManager();
+ FileID MainFileID = SM.getMainFileID();
+
+ // Find the method decls within the AST.
+ SmallVector<Decl *, 1> Decls;
+ AST->findFileRegionDecls(MainFileID, Code.find('{'), 0, Decls);
+ ASSERT_TRUE(Decls.size() == 1);
+ CXXRecordDecl *DeclS = cast<CXXRecordDecl>(Decls[0]);
+ NamedDecl *DeclF = *DeclS->method_begin();
+ NamedDecl *DeclG = *(++DeclS->method_begin());
+
+ // Attach asm labels to the decls: one literal, and one not.
+ DeclF->addAttr(::new (Ctx) AsmLabelAttr(Ctx, SourceLocation(), "foo",
+ /*LiteralLabel=*/true));
+ DeclG->addAttr(::new (Ctx) AsmLabelAttr(Ctx, SourceLocation(), "goo",
+ /*LiteralLabel=*/false));
+
+ // Mangle the decl names.
+ std::string MangleF, MangleG;
+ MangleContext *MC = ItaniumMangleContext::create(Ctx, Diags);
+ {
+ llvm::raw_string_ostream OS_F(MangleF);
+ llvm::raw_string_ostream OS_G(MangleG);
+ MC->mangleName(DeclF, OS_F);
+ MC->mangleName(DeclG, OS_G);
+ }
+
+ ASSERT_TRUE(0 == MangleF.compare("\x01" "foo"));
+ ASSERT_TRUE(0 == MangleG.compare("goo"));
+}