|
33 | 33 | #else
|
34 | 34 | #include "llvm/IR/RemarkStreamer.h"
|
35 | 35 | #endif
|
| 36 | +#include "llvm/Demangle/Demangle.h" |
36 | 37 | #include "llvm/Support/FileSystem.h"
|
37 | 38 | #include "llvm/Support/Path.h"
|
38 | 39 | #include "llvm/Support/ToolOutputFile.h"
|
@@ -166,19 +167,68 @@ void inlineAsmDiagnosticHandler(const llvm::SMDiagnostic &d, void *context,
|
166 | 167 | inlineAsmDiagnostic(static_cast<IRState *>(context), d, locCookie);
|
167 | 168 | }
|
168 | 169 | #else
|
169 |
| -struct InlineAsmDiagnosticHandler : public llvm::DiagnosticHandler { |
| 170 | +struct LDCDiagnosticHandler : public llvm::DiagnosticHandler { |
170 | 171 | IRState *irs;
|
171 |
| - InlineAsmDiagnosticHandler(IRState *irs) : irs(irs) {} |
| 172 | + LDCDiagnosticHandler(IRState *irs) : irs(irs) {} |
172 | 173 |
|
173 | 174 | // return false to defer to LLVMContext::diagnose()
|
174 | 175 | bool handleDiagnostics(const llvm::DiagnosticInfo &DI) override {
|
175 |
| - if (DI.getKind() != llvm::DK_SrcMgr) |
| 176 | + switch (DI.getKind()) |
| 177 | + { |
| 178 | + case llvm::DK_SrcMgr: |
| 179 | + { |
| 180 | + const auto &DISM = llvm::cast<llvm::DiagnosticInfoSrcMgr>(DI); |
| 181 | + switch (DISM.getSeverity()) |
| 182 | + { |
| 183 | + case llvm::DS_Error: |
| 184 | + ++global.errors; |
| 185 | + break; |
| 186 | + case llvm::DS_Warning: |
| 187 | + ++global.warnings; |
| 188 | + break; |
| 189 | + case llvm::DS_Remark: |
| 190 | + case llvm::DS_Note: |
| 191 | + return false; |
| 192 | + } |
| 193 | + |
| 194 | + inlineAsmDiagnostic(irs, DISM.getSMDiag(), DISM.getLocCookie()); |
| 195 | + return true; |
| 196 | + } |
| 197 | + case llvm::DK_StackSize: |
| 198 | + { |
| 199 | + const auto &DISS = llvm::cast<llvm::DiagnosticInfoStackSize>(DI); |
| 200 | +#if LDC_LLVM_VER > 1400 |
| 201 | + llvm::StringRef fname; |
| 202 | + unsigned line, column; |
| 203 | + DISS.getLocation(fname, line, column); |
| 204 | + const auto loc = Loc(fname.str().c_str(), line, column); |
| 205 | +#else |
| 206 | + const auto loc = Loc(nullptr, 0, 0); |
| 207 | +#endif |
| 208 | + switch (DISS.getSeverity()) |
| 209 | + { |
| 210 | + case llvm::DS_Error: |
| 211 | + error(loc, "stack frame size (%ld) exceeds limit (%ld) in '%s'", |
| 212 | + DISS.getStackSize(), |
| 213 | + DISS.getStackLimit(), |
| 214 | + llvm::demangle(DISS.getFunction().getName().str()).c_str() |
| 215 | + ); |
| 216 | + return true; |
| 217 | + case llvm::DS_Warning: |
| 218 | + warning(loc, "stack frame size (%ld) exceeds limit (%ld) in '%s'", |
| 219 | + DISS.getStackSize(), |
| 220 | + DISS.getStackLimit(), |
| 221 | + llvm::demangle(DISS.getFunction().getName().str()).c_str() |
| 222 | + ); |
| 223 | + return true; |
| 224 | + case llvm::DS_Remark: |
| 225 | + case llvm::DS_Note: |
| 226 | + return false; |
| 227 | + } |
176 | 228 | return false;
|
177 |
| - |
178 |
| - const auto &DISM = llvm::cast<llvm::DiagnosticInfoSrcMgr>(DI); |
179 |
| - if (DISM.getKind() == llvm::SourceMgr::DK_Error) |
180 |
| - ++global.errors; |
181 |
| - return inlineAsmDiagnostic(irs, DISM.getSMDiag(), DISM.getLocCookie()); |
| 229 | + } |
| 230 | + } |
| 231 | + return false; |
182 | 232 | }
|
183 | 233 | };
|
184 | 234 | #endif
|
@@ -280,7 +330,7 @@ void CodeGenerator::writeAndFreeLLModule(const char *filename) {
|
280 | 330 | context_.setInlineAsmDiagnosticHandler(inlineAsmDiagnosticHandler, ir_);
|
281 | 331 | #else
|
282 | 332 | context_.setDiagnosticHandler(
|
283 |
| - std::make_unique<InlineAsmDiagnosticHandler>(ir_)); |
| 333 | + std::make_unique<LDCDiagnosticHandler>(ir_)); |
284 | 334 | #endif
|
285 | 335 |
|
286 | 336 | std::unique_ptr<llvm::ToolOutputFile> diagnosticsOutputFile =
|
|
0 commit comments