|  | 
| 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