| 
12 | 12 | 
 
  | 
13 | 13 | #include "clang/AST/Decl.h"  | 
14 | 14 | #include "clang/AST/ASTContext.h"  | 
 | 15 | +#include "clang/AST/DeclCXX.h"  | 
15 | 16 | #include "clang/AST/DeclTemplate.h"  | 
16 | 17 | #include "clang/AST/Mangle.h"  | 
17 | 18 | #include "clang/ASTMatchers/ASTMatchFinder.h"  | 
18 | 19 | #include "clang/ASTMatchers/ASTMatchers.h"  | 
 | 20 | +#include "clang/Basic/ABI.h"  | 
19 | 21 | #include "clang/Basic/Diagnostic.h"  | 
20 | 22 | #include "clang/Basic/LLVM.h"  | 
21 | 23 | #include "clang/Basic/TargetInfo.h"  | 
@@ -102,6 +104,124 @@ TEST(Decl, AsmLabelAttr) {  | 
102 | 104 |                      "foo");  | 
103 | 105 | }  | 
104 | 106 | 
 
  | 
 | 107 | +TEST(Decl, AsmLabelAttr_LLDB) {  | 
 | 108 | +  StringRef Code = R"(  | 
 | 109 | +    struct S {  | 
 | 110 | +      void f() {}  | 
 | 111 | +      S() = default;  | 
 | 112 | +      ~S() = default;  | 
 | 113 | +    };  | 
 | 114 | +  )";  | 
 | 115 | +  auto AST =  | 
 | 116 | +      tooling::buildASTFromCodeWithArgs(Code, {"-target", "i386-apple-darwin"});  | 
 | 117 | +  ASTContext &Ctx = AST->getASTContext();  | 
 | 118 | +  assert(Ctx.getTargetInfo().getUserLabelPrefix() == StringRef("_") &&  | 
 | 119 | +         "Expected target to have a global prefix");  | 
 | 120 | +  DiagnosticsEngine &Diags = AST->getDiagnostics();  | 
 | 121 | + | 
 | 122 | +  const auto *DeclS =  | 
 | 123 | +      selectFirst<CXXRecordDecl>("d", match(cxxRecordDecl().bind("d"), Ctx));  | 
 | 124 | + | 
 | 125 | +  auto *DeclF = *DeclS->method_begin();  | 
 | 126 | +  auto *Ctor = *DeclS->ctor_begin();  | 
 | 127 | +  auto *Dtor = DeclS->getDestructor();  | 
 | 128 | + | 
 | 129 | +  ASSERT_TRUE(DeclF);  | 
 | 130 | +  ASSERT_TRUE(Ctor);  | 
 | 131 | +  ASSERT_TRUE(Dtor);  | 
 | 132 | + | 
 | 133 | +  DeclF->addAttr(AsmLabelAttr::Create(Ctx, "$__lldb_func::123:123:_Z1fv"));  | 
 | 134 | +  Ctor->addAttr(AsmLabelAttr::Create(Ctx, "$__lldb_func::123:123:S"));  | 
 | 135 | +  Dtor->addAttr(AsmLabelAttr::Create(Ctx, "$__lldb_func::123:123:~S"));  | 
 | 136 | + | 
 | 137 | +  std::unique_ptr<ItaniumMangleContext> MC(  | 
 | 138 | +      ItaniumMangleContext::create(Ctx, Diags));  | 
 | 139 | + | 
 | 140 | +  {  | 
 | 141 | +    std::string Mangled;  | 
 | 142 | +    llvm::raw_string_ostream OS_Mangled(Mangled);  | 
 | 143 | +    MC->mangleName(DeclF, OS_Mangled);  | 
 | 144 | + | 
 | 145 | +    ASSERT_EQ(Mangled, "\x01$__lldb_func::123:123:_Z1fv");  | 
 | 146 | +  };  | 
 | 147 | + | 
 | 148 | +  {  | 
 | 149 | +    std::string Mangled;  | 
 | 150 | +    llvm::raw_string_ostream OS_Mangled(Mangled);  | 
 | 151 | +    MC->mangleName(GlobalDecl(Ctor, CXXCtorType::Ctor_Complete), OS_Mangled);  | 
 | 152 | + | 
 | 153 | +    ASSERT_EQ(Mangled, "\x01$__lldb_func:C0:123:123:S");  | 
 | 154 | +  };  | 
 | 155 | + | 
 | 156 | +  {  | 
 | 157 | +    std::string Mangled;  | 
 | 158 | +    llvm::raw_string_ostream OS_Mangled(Mangled);  | 
 | 159 | +    MC->mangleName(GlobalDecl(Ctor, CXXCtorType::Ctor_Base), OS_Mangled);  | 
 | 160 | + | 
 | 161 | +    ASSERT_EQ(Mangled, "\x01$__lldb_func:C1:123:123:S");  | 
 | 162 | +  };  | 
 | 163 | + | 
 | 164 | +  {  | 
 | 165 | +    std::string Mangled;  | 
 | 166 | +    llvm::raw_string_ostream OS_Mangled(Mangled);  | 
 | 167 | +    MC->mangleName(GlobalDecl(Dtor, CXXDtorType::Dtor_Deleting), OS_Mangled);  | 
 | 168 | + | 
 | 169 | +    ASSERT_EQ(Mangled, "\x01$__lldb_func:D0:123:123:~S");  | 
 | 170 | +  };  | 
 | 171 | + | 
 | 172 | +  {  | 
 | 173 | +    std::string Mangled;  | 
 | 174 | +    llvm::raw_string_ostream OS_Mangled(Mangled);  | 
 | 175 | +    MC->mangleName(GlobalDecl(Dtor, CXXDtorType::Dtor_Base), OS_Mangled);  | 
 | 176 | + | 
 | 177 | +    ASSERT_EQ(Mangled, "\x01$__lldb_func:D2:123:123:~S");  | 
 | 178 | +  };  | 
 | 179 | +}  | 
 | 180 | + | 
 | 181 | +TEST(Decl, AsmLabelAttr_LLDB_Inherit) {  | 
 | 182 | +  StringRef Code = R"(  | 
 | 183 | +    struct Base {  | 
 | 184 | +      Base(int x) {}  | 
 | 185 | +    };  | 
 | 186 | +
  | 
 | 187 | +    struct Derived : Base {  | 
 | 188 | +      using Base::Base;  | 
 | 189 | +    } d(5);  | 
 | 190 | +  )";  | 
 | 191 | +  auto AST =  | 
 | 192 | +      tooling::buildASTFromCodeWithArgs(Code, {"-target", "i386-apple-darwin"});  | 
 | 193 | +  ASTContext &Ctx = AST->getASTContext();  | 
 | 194 | +  assert(Ctx.getTargetInfo().getUserLabelPrefix() == StringRef("_") &&  | 
 | 195 | +         "Expected target to have a global prefix");  | 
 | 196 | +  DiagnosticsEngine &Diags = AST->getDiagnostics();  | 
 | 197 | + | 
 | 198 | +  const auto *Ctor = selectFirst<CXXConstructorDecl>(  | 
 | 199 | +      "ctor",  | 
 | 200 | +      match(cxxConstructorDecl(isInheritingConstructor()).bind("ctor"), Ctx));  | 
 | 201 | + | 
 | 202 | +  const_cast<CXXConstructorDecl *>(Ctor)->addAttr(  | 
 | 203 | +      AsmLabelAttr::Create(Ctx, "$__lldb_func::123:123:Derived"));  | 
 | 204 | + | 
 | 205 | +  std::unique_ptr<ItaniumMangleContext> MC(  | 
 | 206 | +      ItaniumMangleContext::create(Ctx, Diags));  | 
 | 207 | + | 
 | 208 | +  {  | 
 | 209 | +    std::string Mangled;  | 
 | 210 | +    llvm::raw_string_ostream OS_Mangled(Mangled);  | 
 | 211 | +    MC->mangleName(GlobalDecl(Ctor, CXXCtorType::Ctor_Complete), OS_Mangled);  | 
 | 212 | + | 
 | 213 | +    ASSERT_EQ(Mangled, "\x01$__lldb_func:CI0:123:123:Derived");  | 
 | 214 | +  };  | 
 | 215 | + | 
 | 216 | +  {  | 
 | 217 | +    std::string Mangled;  | 
 | 218 | +    llvm::raw_string_ostream OS_Mangled(Mangled);  | 
 | 219 | +    MC->mangleName(GlobalDecl(Ctor, CXXCtorType::Ctor_Base), OS_Mangled);  | 
 | 220 | + | 
 | 221 | +    ASSERT_EQ(Mangled, "\x01$__lldb_func:CI1:123:123:Derived");  | 
 | 222 | +  };  | 
 | 223 | +}  | 
 | 224 | + | 
105 | 225 | TEST(Decl, MangleDependentSizedArray) {  | 
106 | 226 |   StringRef Code = R"(  | 
107 | 227 |     template <int ...N>  | 
 | 
0 commit comments