<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/106548>106548</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
How to fix this annoying legacy crash?
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
wqyfavor
</td>
</tr>
</table>
<pre>
For historical reasons, our project must be built using Android NDK r21b. And we want to add some Clang plugins to analyze AST based on this version of the toolchain. NDK itself does not carry the Clang and LLVM header files (such as ASTConsumer) needed to develop plugins, so I found that NDK r21b is compiled based on the following LLVM version:
> Android (6317467 based on r365631c1) clang version 9.0.8 (https://android.googlesource.com/toolchain/llvm-project e0caee08e5f09b374a27a676d04978c81fcb1928) (based on LLVM 9.0.8svn)
And checked out this commit of LLVM and compiled successfully. At this time, I have the same Clang executable and library files as NDK r21b, and obtained the header files required by the plugin, and compiled my Clang plugin with these header files.
But something annoying happened. When I used the compiled Clang to load my plugin and then compiled other code, the compiler crashed with the following log.
```
0 clang-9 0x0000000101d5980c llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 52
1 clang-9 0x0000000101d58af4 llvm::sys::RunSignalHandlers() + 112
2 clang-9 0x0000000101d59e50 SignalHandler(int) + 376
3 libsystem_platform.dylib 0x0000000190313584 _sigtramp + 56
4 libclang_shared.dylib 0x000000010c3b6ad8 llvm::detail::DoubleAPFloat::divide(llvm::detail::DoubleAPFloat const&, llvm::APFloatBase::roundingMode) + 120
5 libclang_shared.dylib 0x000000010c3b6ad8 llvm::detail::DoubleAPFloat::divide(llvm::detail::DoubleAPFloat const&, llvm::APFloatBase::roundingMode) + 120
6 libclang_shared.dylib 0x000000010ac50e20 handleFloatFloatBinOp((anonymous namespace)::EvalInfo&, clang::Expr const*, llvm::APFloat&, clang::BinaryOperatorKind, llvm::APFloat const&) + 520
7 libclang_shared.dylib 0x000000010ac4db30 (anonymous namespace)::FloatExprEvaluator::VisitBinaryOperator(clang::BinaryOperator const*) + 396
8 libclang_shared.dylib 0x000000010ac195c0 Evaluate(clang::APValue&, (anonymous namespace)::EvalInfo&, clang::Expr const*) + 604
9 libclang_shared.dylib 0x000000010ac1a7b4 EvaluateAsRValue((anonymous namespace)::EvalInfo&, clang::Expr const*, clang::APValue&) + 104
10 libclang_shared.dylib 0x000000010ac1a9e8 clang::Expr::EvaluateForOverflow(clang::ASTContext const&) const + 356
11 libclang_shared.dylib 0x000000010af95894 clang::Sema::CheckForIntOverflow(clang::Expr*) + 204
12 libclang_shared.dylib 0x000000010af95ccc clang::Sema::CheckCompletedExpr(clang::Expr*, clang::SourceLocation, bool) + 144
13 libclang_shared.dylib 0x000000010b1f2098 clang::Sema::ActOnFinishFullExpr(clang::Expr*, clang::SourceLocation, bool, bool) + 284
14 libclang_shared.dylib 0x000000010b02082c clang::Sema::AddInitializerToDecl(clang::Decl*, clang::Expr*, bool) + 2552
15 libclang_shared.dylib 0x000000010aa21450 clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*) + 3148
16 libclang_shared.dylib 0x000000010aa1f430 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*) + 652
17 libclang_shared.dylib 0x000000010aa93318 clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) + 808
18 libclang_shared.dylib 0x000000010aa92dbc clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) + 316
19 libclang_shared.dylib 0x000000010aa92410 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 2100
20 libclang_shared.dylib 0x000000010aa90e28 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, bool) + 952
21 libclang_shared.dylib 0x000000010aa0df68 clang::ParseAST(clang::Sema&, bool, bool) + 572
22 clang-9 0x000000010234acfc clang::FrontendAction::Execute() + 108
23 clang-9 0x000000010230f6f4 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 1356
24 clang-9 0x00000001023b9bb0 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1756
25 clang-9 0x000000010085b2b0 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 1216
26 clang-9 0x0000000100859d98 main + 10600
27 dyld 0x000000018ff5a0e0 start + 2360
clang-9: error: unable to execute command: Segmentation fault: 11
clang-9: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 9.0.0 (https://android.googlesource.com/toolchain/llvm-project e0caee08e5f09b374a27a676d04978c81fcb1928)
Target: arm-apple-darwin23.5.0
Thread model: posix
InstalledDir: /Users/XXX/Desktop/Dev/Refs/llvm-ndk-r21b/llvm-project/mybuild/Release/bin
clang-9: note: diagnostic msg: PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
clang-9: error: unable to execute command: Segmentation fault: 11
clang-9: note: diagnostic msg: Error generating preprocessed source(s).
```
The command I used is like this:
```
~/Dev/llvm-ndk-r21b/llvm-project/mybuild/Release/bin/clang++ -Xclang -load -Xclang libMyPlugin.dylib -Xclang -plugin -Xclang my_analysis -std=c++17 -stdlib=libc++ -c A.cpp
```
There is no code of my plugin on the entire stack. If the plugin is not loaded, the compiler will not crash. Contents of A.cpp is simplified as:
```C++
const double M_PI = 3.14;
const double M_PI_2 = M_PI / 2.0f;
```
My plugin is also very simple.
```C++
class MyAnalysisASTVisitor {
};
class MyAnalysisASTConsumer : public ASTConsumer {
public:
explicit MyAnalysisASTConsumer() {}
void HandleTranslationUnit(ASTContext &ctx) override {
ast_visitor_.TraverseDecl(ctx.getTranslationUnitDecl());
}
private:
MyAnalysisASTVisitor ast_visitor_;
};
class MyAnalysisAction : public PluginASTAction {
public:
std::unique_ptr<ASTConsumer>
CreateASTConsumer(CompilerInstance &compiler,
llvm::StringRef infile) override {
return std::unique_ptr<ASTConsumer>(
std::make_unique<MyAnalysisASTConsumer>(compiler.getASTContext(), rule_set_));
}
static FrontendPluginRegistry::Add<MyAnalysisAction> my_analysis("my_analysis", "");
```
Even if I comment out `HandleTranslationUnit` completely and do not execute any MyAnalysisASTVisitor code, it will still crash.
The latest LLVM18 will not have any problems, and I have not tried other versions of LLVM. So which commit fixed this crash? Because we must use the same LLVM version as NDK r21b, I want to pick this commit to my own branch.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWk1v4zjS_jXKpRBDovwhHXJwnPidYLrfDjqZmb4FFFWyuaFINUk58Rz2ty9IfViynW5jd2aBNQJDFsmq56kqksViqDF8IxFvgtltMLu7orXdKn3z9n1f0J3SV5nK9zdrpWHLjVWaMypAIzVKmoCsQNUaKq3-gcxCWRsLGUJWc2GhNlxuYClzrXgO_3_3K2gSZRP3Bt4Q3qi0YBXQPAejSoSVoHIDlag3XBrfIqnY_4mwfHqGjBrMQUmwW25gh9pwJUEVYLcIVinBtpTLiVfDrUFRQK7QgFQWGNV67zs2KqjM4dOn3z_DFmmOGgou0EBAElOzLVDjFK6UNHWJOiApSMQcc4coxx0KVXUgHX-j4AEKVcsc7JbanidwA0yVFReYD9EjFEoI9eZs40G0XIJ4GYR3Qdh9x_e96QKSzONoMZ0vDoJ0PJ_N44hFDiDztDqjpJNwkrhBW2sr4-SSdUDWtJE22Si1EWhUrRlOmCoDsu7tF5C1ELvyunMohowihgnOijDN4sWUkgWdL-Z5OE0XCUuigmVRShIHIiBJj84T8zjMTgYkHTJz7mdbZK-ua20bhzJVltw6f_qhzkO98UzNGBpT1ELsJ7BsR1heorP_A2zpDr1hDe2jCN-R1ZZmAr0swTNN9b71NDW9l5wE10FllnLpnLzFcVho_F5z7XzYhFDj-m5cD7Lcj-IX3rjduv5mLG4ytMRtbX3k2y33USnV3j1saVWhxHwCf2xRwgPUpgXWa2tUWQVCUa-71Up9FKI89FR2ixqYyr2xBkI0ME3NFvMe6iAwhdqMkAbzsP3zP0NoQu46hfA9bD5RGOWzNAkZuAhyURcvzd40D4-aS_tkKXt91pRhQJJDJ03fXpSxGmkZkHkTSbcwI42qqNd08hmrTmgxPaf6ay2f-EZS8QuVuUBtgi5cbyGKWi0ELlWT4iyEkcCAJFzaTmS8mDciY3BRZ_bGYvlSCWoLpctJvhc8G4hMwziKZ8kUXgzfWE3LqmHfCpk6GR7Zi9lSjXkrYAyLxdmc5smAfY6WctE836k6E7h8XAtFbdvMdzwfe-HDEcCUNNZ7ZjXQ0LbeUoOtG90SyOXmsw-11r6kDZgZfEDkf4rF_AIWlM1CJCFsfXB46Y0KLr9UPvQSKpXcl6o2IGmJpvITIm303--oeJCFapF6XW3Le6U7FsuzLE7H3HJJ9f5LhZpapX_lMj87cGCcbvK1jBcfMR4HIGXTPItD-Ak5r8zxcCxrB6l5_zs33I6xBiT5kMfACu2cS9vpklwKN0pnLIQWBo6VLR9_p6LG1pp_lb8apPNw2iBNL0ZKF9m0R7o0X1twf2EgfcC9Df4OcRRejDjF5FjhAZSjsVb6yw51IdTbke194mXxfRyT_rlxdbcyRtFlcIp0lqTTIZwnLGnztHJZyFrpB2nPw_HID94jvS3IxcoZYz9QvlJlJdBi3mg6q3vkoCeftn1SjFqXM5IVZEqJ3lnTDmB8EcAsKkiYJucBLpn9ItdccrNd10L8pwjHSEnSIb1si8tCEibkA1Mu8_xBcsup4H-iflZ3yMQYavPmGOqAwAjbrE8-Zpf5mZJoOguHoh-pNqgHzw4B1d4my8Ki7n4rvZT50lrNs9qiOYVN2_XweBqfaMifsXR5BrppP9rvPhi1VvorlRt0thuuptE0aenPL6QfFdP45_T_T6u6GhN0bVxuXOtThewU78EC7brwk2g7dvEFfOe9txcXbO80jeMo-SnXL3pdS-Yw3WHxIC1qScUp97EDD2HwB7dbj_W8B39osqU_Lbk2XvDmAOtoJmHn1eRCr6Ykz9ilQT0izN1sdO74O_ie7Fnn-cZRt1OkF_OdRj-O4vv3xpED3n8bx3YtisI2FSMf7b9jDiGSH0fns6o-4Q7F6SL5paLfa3y0OohXR1PQT92vWATxfYt-uGCm3QwiF27KNMyL-SnM5dPzGJFf4of6xnpni04vOXceJfGUsmIUwWvtVhGZL32kdrsAstri8FjYTRUSn5cbFvNilFOs2jP1gzSWSoYjya2yEbMjIIN8q89wyPSiMymJszTLwvG-5vUeQO369TH5EehD2EWLHsXsIhRhMsuIQ8Gil9IXkgansqXWdO-jZ8W2dJB8umhawfgdWcFO8XwIhnRTmczP-SNMZmmeJuD0tv6b97NmAfle5IPuSVHMaIghGEt1k1SSuCtstNKDeAmotT-fQC19GcmqtqjkKygllblrfMJNidJ660JBa-HOphBFH4tranVF6_9OFhTUl2vy2msyvsDgDh-1Qbje-XeIwAeuTAc6RrW_8L9e-2uQPFO9Qc-f6vKaVpXA65zqNy5JPJlNWhM_bzXSHEqVozuoQ6UMf2-afCAKgfkd96YKyPo34ys262_fvgVkfYfm1arKP-0Csv6Khelgy_z1uqnojWgEZF3us5qL3PcX6I76ZJ1xeeIiqaybuJBzupHKWM6gNG6uwOOn--XTPZg6K7kFClm9AY2V0r6APTZ1Vm_MxCGYKL0JyNrX5Lhkos6bKqUvu0FG2attamErqDRWWrltDHNovNMVGKkxinFqMQddSzBM88pO_u5o_dgU904RbFC6sziXm_PYExOQdHK2dthFQQ-sK3ByA4K_oq_uHhfDxyL-2QfAv-l5sm6WQXLrpv_1t2YOXftiavdL8Ozz_tGXVdtNrO_XFlu73-X-xd9UGG7g2tg8iO9YIzpa-BeCZ0F853bGTiOD5YRV1Y8NpNHZRCpfvQVVDOq87U0CSss1upWMvU7goRgUqJuh1heIMT-p_b5xIZq7EReNE_DZtbTGqfHQ3HjDy0q4pMqF4UcuWTWc2hDyB_XcV97g88vjAwTxHcSTaBrEH3V5Ib5T05usgUzCou991jaf9wOSVBjllr99AxfP163HKAU1Bj7vl63Xlk_PvgSlNASLTvHi7gBi8H1mbHdVBH45qzPBGYxedzKbtt6QAPheCc64PS-vy0gWtw7MAAP4HRKa-vOzptIIP6V_8webZFBECcic2XcnRe1Qa57jAQ1QY192De-XybOmbg_BLi2075MN2iPhbaNb8Unamwd6eJXmO-pXjg7oWSMPFR-MfGLwE1P7XGlo5WZ6Lp-eu6aPLO1npUtFasm_1_hS-SR3aOv4voO80kgtjv1wnCp5w7bvArLqhp5-DknQk9Vcbr5iAVwWXOAHTtFoay0vA0ySY3olfcWXZkgQr85HlR_YgXdOPsRL59sV6Frgi0H7cuxrOIpF43YTBl0-23jkK264sXrfl2fGYNrk-364cnrVZPSCNPVX4v_SHy8J9zuUwAt48LsKSuuvFoN5eH6SzEO_FAq0KPZ-n82VXw67TZPK_fnY7W7SuG3WUGPdd7OKHm9wglo01t9oRslhyfX3lU5BpVUmsDTdXt9eZbo-VvP-8q7N7Ux3OzqBJwVvW8623bVpwd_9DSE3DZIgXsMtMuqSxzdsruXdc39JOrx4Pr4Ofehv5ivOXkfXs1a5PUi9Scg0lWw7ucpv4jyNU3qFN9GCTNN4mkTR1fZmMZ1N43CahTQmiySPihCjEBkLU5oTksZX_IaEZBomJI1IHMfRZL6YLjLE2ZzOonQ2DYNpiCXlos-lrrgxNd5E4Xw2Ta4EzVAY_z8LhEh8A9_qQmV2d6VvfCLgUrFgGgpu7CElu7LcCrz5Rb05OgV_bxj2t68CN5Ttezte1VrcjDO8DbfbOmvTZz_BTxIPD8alpi3a3Q35VwAAAP__CBVlog">