Peter Collingbourne | 84c287e | 2011-10-01 16:41:13 +0000 | [diff] [blame] | 1 | //===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===// |
Misha Brukman | 650ba8e | 2005-04-22 00:00:37 +0000 | [diff] [blame] | 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
Misha Brukman | 650ba8e | 2005-04-22 00:00:37 +0000 | [diff] [blame] | 6 | // |
John Criswell | d303203 | 2003-10-20 20:20:30 +0000 | [diff] [blame] | 7 | //===----------------------------------------------------------------------===// |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 8 | // |
Peter Collingbourne | 84c287e | 2011-10-01 16:41:13 +0000 | [diff] [blame] | 9 | // This file contains the main function for LLVM's TableGen. |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
Jakob Stoklund Olesen | e6aed13 | 2012-06-11 15:37:55 +0000 | [diff] [blame] | 13 | #include "TableGenBackends.h" // Declares all backends. |
Chris Lattner | ee3c74f | 2009-07-08 18:44:05 +0000 | [diff] [blame] | 14 | #include "llvm/Support/CommandLine.h" |
Craig Topper | dc6c3fc | 2016-01-04 04:51:51 +0000 | [diff] [blame] | 15 | #include "llvm/Support/ManagedStatic.h" |
Chris Lattner | ee3c74f | 2009-07-08 18:44:05 +0000 | [diff] [blame] | 16 | #include "llvm/Support/PrettyStackTrace.h" |
Michael J. Spencer | 447762d | 2010-11-29 18:16:10 +0000 | [diff] [blame] | 17 | #include "llvm/Support/Signals.h" |
Peter Collingbourne | 84c287e | 2011-10-01 16:41:13 +0000 | [diff] [blame] | 18 | #include "llvm/TableGen/Main.h" |
| 19 | #include "llvm/TableGen/Record.h" |
James Molloy | f1653b5 | 2014-06-17 13:10:38 +0000 | [diff] [blame] | 20 | #include "llvm/TableGen/SetTheory.h" |
Peter Collingbourne | 84c287e | 2011-10-01 16:41:13 +0000 | [diff] [blame] | 21 | |
Chris Lattner | 6847866 | 2004-08-01 03:55:39 +0000 | [diff] [blame] | 22 | using namespace llvm; |
Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 23 | |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 24 | enum ActionType { |
| 25 | PrintRecords, |
Simon Tatham | 6a8c6ca | 2018-07-11 08:40:19 +0000 | [diff] [blame] | 26 | DumpJSON, |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 27 | GenEmitter, |
Evan Cheng | d9997ac | 2011-06-27 18:32:37 +0000 | [diff] [blame] | 28 | GenRegisterInfo, |
Evan Cheng | 1e210d0 | 2011-06-28 20:07:07 +0000 | [diff] [blame] | 29 | GenInstrInfo, |
Oliver Stannard | 174fdef | 2017-11-14 15:35:15 +0000 | [diff] [blame] | 30 | GenInstrDocs, |
Evan Cheng | 1e210d0 | 2011-06-28 20:07:07 +0000 | [diff] [blame] | 31 | GenAsmWriter, |
| 32 | GenAsmMatcher, |
Daniel Dunbar | e502433 | 2009-11-25 02:13:23 +0000 | [diff] [blame] | 33 | GenDisassembler, |
Jim Grosbach | bcb36be | 2011-07-08 17:36:35 +0000 | [diff] [blame] | 34 | GenPseudoLowering, |
Sameer AbuAsal | c1b0e66 | 2018-04-06 21:07:05 +0000 | [diff] [blame] | 35 | GenCompressInst, |
Chris Lattner | cbebe46 | 2007-02-27 22:08:27 +0000 | [diff] [blame] | 36 | GenCallingConv, |
Chris Lattner | 90d0004 | 2005-09-03 01:14:03 +0000 | [diff] [blame] | 37 | GenDAGISel, |
Anshuman Dasgupta | 08ebdc1 | 2011-12-01 21:10:21 +0000 | [diff] [blame] | 38 | GenDFAPacketizer, |
Dan Gohman | b2226e2 | 2008-08-13 20:19:35 +0000 | [diff] [blame] | 39 | GenFastISel, |
Jim Laskey | 9ed9032 | 2005-10-21 19:05:19 +0000 | [diff] [blame] | 40 | GenSubtarget, |
Reid Kleckner | f5890e4 | 2018-06-23 02:02:38 +0000 | [diff] [blame] | 41 | GenIntrinsicEnums, |
| 42 | GenIntrinsicImpl, |
| 43 | GenTgtIntrinsicEnums, |
| 44 | GenTgtIntrinsicImpl, |
Jakob Stoklund Olesen | fc205a5 | 2011-06-04 04:11:37 +0000 | [diff] [blame] | 45 | PrintEnums, |
Michael J. Spencer | 41ee041 | 2012-12-05 00:29:32 +0000 | [diff] [blame] | 46 | PrintSets, |
Sean Silva | cdd21b3 | 2013-03-21 23:40:38 +0000 | [diff] [blame] | 47 | GenOptParserDefs, |
Jonas Devlieghere | 64ada7a | 2019-11-22 14:07:21 -0800 | [diff] [blame^] | 48 | GenOptRST, |
Akira Hatanaka | d932679 | 2015-11-11 20:35:42 +0000 | [diff] [blame] | 49 | GenCTags, |
Tim Northover | e6ae676 | 2016-07-05 21:23:04 +0000 | [diff] [blame] | 50 | GenAttributes, |
| 51 | GenSearchableTables, |
Ahmed Bougacha | 36f7035 | 2016-12-21 23:26:20 +0000 | [diff] [blame] | 52 | GenGlobalISel, |
Daniel Sanders | 505d7f3 | 2019-10-02 21:13:07 +0000 | [diff] [blame] | 53 | GenGICombiner, |
Ayman Musa | 850fc97 | 2017-03-07 08:11:19 +0000 | [diff] [blame] | 54 | GenX86EVEX2VEXTables, |
Ayman Musa | 993339b | 2017-10-08 09:20:32 +0000 | [diff] [blame] | 55 | GenX86FoldTables, |
Daniel Sanders | d64d5024 | 2017-01-19 11:15:55 +0000 | [diff] [blame] | 56 | GenRegisterBank, |
Clement Courbet | 41c8af3 | 2018-10-25 07:44:01 +0000 | [diff] [blame] | 57 | GenExegesis, |
James Molloy | e667401 | 2019-10-04 09:03:36 +0000 | [diff] [blame] | 58 | GenAutomata, |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 59 | }; |
| 60 | |
Daniel Sanders | 6cbc929 | 2019-02-11 23:02:02 +0000 | [diff] [blame] | 61 | namespace llvm { |
| 62 | /// Storage for TimeRegionsOpt as a global so that backends aren't required to |
| 63 | /// include CommandLine.h |
| 64 | bool TimeRegions = false; |
| 65 | } // end namespace llvm |
| 66 | |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 67 | namespace { |
Daniel Sanders | 9ac0cda | 2019-10-02 19:56:04 +0000 | [diff] [blame] | 68 | cl::opt<ActionType> Action( |
| 69 | cl::desc("Action to perform:"), |
| 70 | cl::values( |
| 71 | clEnumValN(PrintRecords, "print-records", |
| 72 | "Print all records to stdout (default)"), |
| 73 | clEnumValN(DumpJSON, "dump-json", |
| 74 | "Dump all records as machine-readable JSON"), |
| 75 | clEnumValN(GenEmitter, "gen-emitter", "Generate machine code emitter"), |
| 76 | clEnumValN(GenRegisterInfo, "gen-register-info", |
| 77 | "Generate registers and register classes info"), |
| 78 | clEnumValN(GenInstrInfo, "gen-instr-info", |
| 79 | "Generate instruction descriptions"), |
| 80 | clEnumValN(GenInstrDocs, "gen-instr-docs", |
| 81 | "Generate instruction documentation"), |
| 82 | clEnumValN(GenCallingConv, "gen-callingconv", |
| 83 | "Generate calling convention descriptions"), |
| 84 | clEnumValN(GenAsmWriter, "gen-asm-writer", "Generate assembly writer"), |
| 85 | clEnumValN(GenDisassembler, "gen-disassembler", |
| 86 | "Generate disassembler"), |
| 87 | clEnumValN(GenPseudoLowering, "gen-pseudo-lowering", |
| 88 | "Generate pseudo instruction lowering"), |
| 89 | clEnumValN(GenCompressInst, "gen-compress-inst-emitter", |
| 90 | "Generate RISCV compressed instructions."), |
| 91 | clEnumValN(GenAsmMatcher, "gen-asm-matcher", |
| 92 | "Generate assembly instruction matcher"), |
| 93 | clEnumValN(GenDAGISel, "gen-dag-isel", |
| 94 | "Generate a DAG instruction selector"), |
| 95 | clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer", |
| 96 | "Generate DFA Packetizer for VLIW targets"), |
| 97 | clEnumValN(GenFastISel, "gen-fast-isel", |
| 98 | "Generate a \"fast\" instruction selector"), |
| 99 | clEnumValN(GenSubtarget, "gen-subtarget", |
| 100 | "Generate subtarget enumerations"), |
| 101 | clEnumValN(GenIntrinsicEnums, "gen-intrinsic-enums", |
| 102 | "Generate intrinsic enums"), |
| 103 | clEnumValN(GenIntrinsicImpl, "gen-intrinsic-impl", |
| 104 | "Generate intrinsic information"), |
| 105 | clEnumValN(GenTgtIntrinsicEnums, "gen-tgt-intrinsic-enums", |
| 106 | "Generate target intrinsic enums"), |
| 107 | clEnumValN(GenTgtIntrinsicImpl, "gen-tgt-intrinsic-impl", |
| 108 | "Generate target intrinsic information"), |
| 109 | clEnumValN(PrintEnums, "print-enums", "Print enum values for a class"), |
| 110 | clEnumValN(PrintSets, "print-sets", |
| 111 | "Print expanded sets for testing DAG exprs"), |
| 112 | clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", |
| 113 | "Generate option definitions"), |
Jonas Devlieghere | 64ada7a | 2019-11-22 14:07:21 -0800 | [diff] [blame^] | 114 | clEnumValN(GenOptRST, "gen-opt-rst", "Generate option RST"), |
Daniel Sanders | 9ac0cda | 2019-10-02 19:56:04 +0000 | [diff] [blame] | 115 | clEnumValN(GenCTags, "gen-ctags", "Generate ctags-compatible index"), |
| 116 | clEnumValN(GenAttributes, "gen-attrs", "Generate attributes"), |
| 117 | clEnumValN(GenSearchableTables, "gen-searchable-tables", |
| 118 | "Generate generic binary-searchable table"), |
| 119 | clEnumValN(GenGlobalISel, "gen-global-isel", |
| 120 | "Generate GlobalISel selector"), |
Daniel Sanders | 505d7f3 | 2019-10-02 21:13:07 +0000 | [diff] [blame] | 121 | clEnumValN(GenGICombiner, "gen-global-isel-combiner", |
| 122 | "Generate GlobalISel combiner"), |
Daniel Sanders | 9ac0cda | 2019-10-02 19:56:04 +0000 | [diff] [blame] | 123 | clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables", |
| 124 | "Generate X86 EVEX to VEX compress tables"), |
| 125 | clEnumValN(GenX86FoldTables, "gen-x86-fold-tables", |
| 126 | "Generate X86 fold tables"), |
| 127 | clEnumValN(GenRegisterBank, "gen-register-bank", |
| 128 | "Generate registers bank descriptions"), |
| 129 | clEnumValN(GenExegesis, "gen-exegesis", |
James Molloy | e667401 | 2019-10-04 09:03:36 +0000 | [diff] [blame] | 130 | "Generate llvm-exegesis tables"), |
Jonas Devlieghere | 64ada7a | 2019-11-22 14:07:21 -0800 | [diff] [blame^] | 131 | clEnumValN(GenAutomata, "gen-automata", "Generate generic automata"))); |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 132 | |
Daniel Sanders | 9ac0cda | 2019-10-02 19:56:04 +0000 | [diff] [blame] | 133 | cl::OptionCategory PrintEnumsCat("Options for -print-enums"); |
| 134 | cl::opt<std::string> Class("class", cl::desc("Print Enum list for this class"), |
| 135 | cl::value_desc("class name"), |
| 136 | cl::cat(PrintEnumsCat)); |
Jakob Stoklund Olesen | e6aed13 | 2012-06-11 15:37:55 +0000 | [diff] [blame] | 137 | |
Daniel Sanders | 6cbc929 | 2019-02-11 23:02:02 +0000 | [diff] [blame] | 138 | cl::opt<bool, true> |
| 139 | TimeRegionsOpt("time-regions", |
| 140 | cl::desc("Time regions of tablegens execution"), |
| 141 | cl::location(TimeRegions)); |
| 142 | |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 143 | bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) { |
| 144 | switch (Action) { |
| 145 | case PrintRecords: |
| 146 | OS << Records; // No argument, dump all contents |
| 147 | break; |
Simon Tatham | 6a8c6ca | 2018-07-11 08:40:19 +0000 | [diff] [blame] | 148 | case DumpJSON: |
| 149 | EmitJSON(Records, OS); |
| 150 | break; |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 151 | case GenEmitter: |
| 152 | EmitCodeEmitter(Records, OS); |
| 153 | break; |
| 154 | case GenRegisterInfo: |
| 155 | EmitRegisterInfo(Records, OS); |
| 156 | break; |
| 157 | case GenInstrInfo: |
| 158 | EmitInstrInfo(Records, OS); |
| 159 | break; |
Oliver Stannard | 174fdef | 2017-11-14 15:35:15 +0000 | [diff] [blame] | 160 | case GenInstrDocs: |
| 161 | EmitInstrDocs(Records, OS); |
| 162 | break; |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 163 | case GenCallingConv: |
| 164 | EmitCallingConv(Records, OS); |
| 165 | break; |
| 166 | case GenAsmWriter: |
| 167 | EmitAsmWriter(Records, OS); |
| 168 | break; |
| 169 | case GenAsmMatcher: |
| 170 | EmitAsmMatcher(Records, OS); |
| 171 | break; |
| 172 | case GenDisassembler: |
| 173 | EmitDisassembler(Records, OS); |
| 174 | break; |
| 175 | case GenPseudoLowering: |
| 176 | EmitPseudoLowering(Records, OS); |
| 177 | break; |
Sameer AbuAsal | c1b0e66 | 2018-04-06 21:07:05 +0000 | [diff] [blame] | 178 | case GenCompressInst: |
| 179 | EmitCompressInst(Records, OS); |
| 180 | break; |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 181 | case GenDAGISel: |
| 182 | EmitDAGISel(Records, OS); |
| 183 | break; |
| 184 | case GenDFAPacketizer: |
| 185 | EmitDFAPacketizer(Records, OS); |
| 186 | break; |
| 187 | case GenFastISel: |
| 188 | EmitFastISel(Records, OS); |
| 189 | break; |
| 190 | case GenSubtarget: |
| 191 | EmitSubtarget(Records, OS); |
| 192 | break; |
Reid Kleckner | f5890e4 | 2018-06-23 02:02:38 +0000 | [diff] [blame] | 193 | case GenIntrinsicEnums: |
| 194 | EmitIntrinsicEnums(Records, OS); |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 195 | break; |
Reid Kleckner | f5890e4 | 2018-06-23 02:02:38 +0000 | [diff] [blame] | 196 | case GenIntrinsicImpl: |
| 197 | EmitIntrinsicImpl(Records, OS); |
| 198 | break; |
| 199 | case GenTgtIntrinsicEnums: |
| 200 | EmitIntrinsicEnums(Records, OS, true); |
| 201 | break; |
| 202 | case GenTgtIntrinsicImpl: |
| 203 | EmitIntrinsicImpl(Records, OS, true); |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 204 | break; |
Michael J. Spencer | 41ee041 | 2012-12-05 00:29:32 +0000 | [diff] [blame] | 205 | case GenOptParserDefs: |
| 206 | EmitOptParser(Records, OS); |
| 207 | break; |
Jonas Devlieghere | 64ada7a | 2019-11-22 14:07:21 -0800 | [diff] [blame^] | 208 | case GenOptRST: |
| 209 | EmitOptRST(Records, OS); |
| 210 | break; |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 211 | case PrintEnums: |
| 212 | { |
Craig Topper | 5fcc5ab | 2014-12-11 07:04:54 +0000 | [diff] [blame] | 213 | for (Record *Rec : Records.getAllDerivedDefinitions(Class)) |
| 214 | OS << Rec->getName() << ", "; |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 215 | OS << "\n"; |
| 216 | break; |
| 217 | } |
| 218 | case PrintSets: |
| 219 | { |
| 220 | SetTheory Sets; |
| 221 | Sets.addFieldExpander("Set", "Elements"); |
Craig Topper | 5fcc5ab | 2014-12-11 07:04:54 +0000 | [diff] [blame] | 222 | for (Record *Rec : Records.getAllDerivedDefinitions("Set")) { |
| 223 | OS << Rec->getName() << " = ["; |
| 224 | const std::vector<Record*> *Elts = Sets.expand(Rec); |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 225 | assert(Elts && "Couldn't expand Set instance"); |
Craig Topper | 5fcc5ab | 2014-12-11 07:04:54 +0000 | [diff] [blame] | 226 | for (Record *Elt : *Elts) |
| 227 | OS << ' ' << Elt->getName(); |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 228 | OS << " ]\n"; |
Jakob Stoklund Olesen | fc205a5 | 2011-06-04 04:11:37 +0000 | [diff] [blame] | 229 | } |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 230 | break; |
| 231 | } |
Sean Silva | cdd21b3 | 2013-03-21 23:40:38 +0000 | [diff] [blame] | 232 | case GenCTags: |
| 233 | EmitCTags(Records, OS); |
| 234 | break; |
Akira Hatanaka | d932679 | 2015-11-11 20:35:42 +0000 | [diff] [blame] | 235 | case GenAttributes: |
| 236 | EmitAttributes(Records, OS); |
| 237 | break; |
Tim Northover | e6ae676 | 2016-07-05 21:23:04 +0000 | [diff] [blame] | 238 | case GenSearchableTables: |
| 239 | EmitSearchableTables(Records, OS); |
| 240 | break; |
Ahmed Bougacha | 36f7035 | 2016-12-21 23:26:20 +0000 | [diff] [blame] | 241 | case GenGlobalISel: |
| 242 | EmitGlobalISel(Records, OS); |
Daniel Sanders | 320f79c | 2017-02-03 14:18:35 +0000 | [diff] [blame] | 243 | break; |
Daniel Sanders | 505d7f3 | 2019-10-02 21:13:07 +0000 | [diff] [blame] | 244 | case GenGICombiner: |
| 245 | EmitGICombiner(Records, OS); |
| 246 | break; |
Daniel Sanders | d64d5024 | 2017-01-19 11:15:55 +0000 | [diff] [blame] | 247 | case GenRegisterBank: |
| 248 | EmitRegisterBank(Records, OS); |
Ahmed Bougacha | 36f7035 | 2016-12-21 23:26:20 +0000 | [diff] [blame] | 249 | break; |
Ayman Musa | 850fc97 | 2017-03-07 08:11:19 +0000 | [diff] [blame] | 250 | case GenX86EVEX2VEXTables: |
| 251 | EmitX86EVEX2VEXTables(Records, OS); |
| 252 | break; |
Ayman Musa | 993339b | 2017-10-08 09:20:32 +0000 | [diff] [blame] | 253 | case GenX86FoldTables: |
| 254 | EmitX86FoldTables(Records, OS); |
| 255 | break; |
Clement Courbet | 41c8af3 | 2018-10-25 07:44:01 +0000 | [diff] [blame] | 256 | case GenExegesis: |
| 257 | EmitExegesis(Records, OS); |
| 258 | break; |
James Molloy | e667401 | 2019-10-04 09:03:36 +0000 | [diff] [blame] | 259 | case GenAutomata: |
| 260 | EmitAutomata(Records, OS); |
| 261 | break; |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 262 | } |
| 263 | |
| 264 | return false; |
| 265 | } |
David Blaikie | a379b181 | 2011-12-20 02:50:00 +0000 | [diff] [blame] | 266 | } |
Alexis Hunt | f4cdc84 | 2010-05-05 04:13:08 +0000 | [diff] [blame] | 267 | |
Peter Collingbourne | 84c287e | 2011-10-01 16:41:13 +0000 | [diff] [blame] | 268 | int main(int argc, char **argv) { |
Richard Smith | 2ad6d48 | 2016-06-09 00:53:21 +0000 | [diff] [blame] | 269 | sys::PrintStackTraceOnErrorSignal(argv[0]); |
Peter Collingbourne | 84c287e | 2011-10-01 16:41:13 +0000 | [diff] [blame] | 270 | PrettyStackTraceProgram X(argc, argv); |
| 271 | cl::ParseCommandLineOptions(argc, argv); |
| 272 | |
Craig Topper | dc6c3fc | 2016-01-04 04:51:51 +0000 | [diff] [blame] | 273 | llvm_shutdown_obj Y; |
| 274 | |
Sean Silva | a3bf561 | 2012-10-03 21:29:19 +0000 | [diff] [blame] | 275 | return TableGenMain(argv[0], &LLVMTableGenMain); |
Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 276 | } |
Kostya Serebryany | a6afef7 | 2014-01-10 08:05:42 +0000 | [diff] [blame] | 277 | |
Kamil Rytarowski | b2077fd | 2019-09-24 11:22:34 +0000 | [diff] [blame] | 278 | #ifndef __has_feature |
| 279 | #define __has_feature(x) 0 |
| 280 | #endif |
| 281 | |
| 282 | #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) || \ |
| 283 | __has_feature(leak_sanitizer) |
| 284 | |
Kostya Serebryany | 317e2c4 | 2014-01-15 07:59:37 +0000 | [diff] [blame] | 285 | #include <sanitizer/lsan_interface.h> |
Kostya Serebryany | a6afef7 | 2014-01-10 08:05:42 +0000 | [diff] [blame] | 286 | // Disable LeakSanitizer for this binary as it has too many leaks that are not |
Kostya Serebryany | 317e2c4 | 2014-01-15 07:59:37 +0000 | [diff] [blame] | 287 | // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . |
Francis Ricci | 8a1c2b4 | 2017-09-11 13:50:39 +0000 | [diff] [blame] | 288 | LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; } |
Kamil Rytarowski | b2077fd | 2019-09-24 11:22:34 +0000 | [diff] [blame] | 289 | |
| 290 | #endif |