Mercurial > projects > ldc
annotate gen/logger.h @ 1650:40bd4a0d4870
Update to work with LLVM 2.7.
Removed use of dyn_cast, llvm no compiles
without exceptions and rtti by
default. We do need exceptions for the libconfig stuff, but rtti isn't
necessary (anymore).
Debug info needs to be rewritten, as in LLVM 2.7 the format has
completely changed. To have something to look at while rewriting, the
old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means
that you have to define this to compile at the moment.
Updated tango 0.99.9 patch to include updated EH runtime code, which is
needed for LLVM 2.7 as well.
author | Tomas Lindquist Olsen |
---|---|
date | Wed, 19 May 2010 12:42:32 +0200 |
parents | 2292878925f4 |
children |
rev | line source |
---|---|
1 | 1 #ifndef _llvmd_gen_logger_h_ |
2 #define _llvmd_gen_logger_h_ | |
3 | |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
4 #include <iosfwd> |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
5 |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
6 namespace llvm { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
7 class Type; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
8 class Value; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
9 } |
1 | 10 |
1372
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
11 #ifndef IS_PRINTF |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
12 # ifdef __GNUC__ |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
13 # define IS_PRINTF(FMTARG) __attribute((__format__ (__printf__, (FMTARG), (FMTARG)+1) )) |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
14 # else |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
15 # define IS_PRINTF(FMTARG) |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
16 # endif |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
17 #endif |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
18 |
132 | 19 struct Loc; |
20 | |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
21 class Stream { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
22 std::ostream* OS; |
1650 | 23 |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
24 public: |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
25 Stream() : OS(0) {} |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
26 Stream(std::ostream* S) : OS(S) {} |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
27 Stream(std::ostream& S) : OS(&S) {} |
1650 | 28 |
29 /* | |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
30 Stream operator << (std::ios_base &(*Func)(std::ios_base&)) { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
31 if (OS) *OS << Func; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
32 return *this; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
33 } |
1650 | 34 */ |
35 | |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
36 Stream operator << (std::ostream &(*Func)(std::ostream&)) { |
1650 | 37 if (OS) Func(*OS); |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
38 return *this; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
39 } |
1650 | 40 |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
41 template<typename Ty> |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
42 Stream& operator << (const Ty& Thing) { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
43 if (OS) |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
44 Writer<Ty, sizeof(sfinae_bait(Thing))>::write(*OS, Thing); |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
45 return *this; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
46 } |
1650 | 47 |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
48 private: |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
49 // Implementation details to treat llvm::Value, llvm::Type and their |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
50 // subclasses specially (to pretty-print types). |
1650 | 51 |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
52 static void writeType(std::ostream& OS, const llvm::Type& Ty); |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
53 static void writeValue(std::ostream& OS, const llvm::Value& Ty); |
1650 | 54 |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
55 template<typename Ty, int N> friend struct Writer; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
56 // error: function template partial specialization is not allowed |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
57 // So I guess type partial specialization + member function will have to do... |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
58 template<typename Ty, int N> |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
59 struct Writer { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
60 static void write(std::ostream& OS, const Ty& Thing) { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
61 OS << Thing; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
62 } |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
63 }; |
1650 | 64 |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
65 template<typename Ty> |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
66 struct Writer<Ty, 1> { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
67 static void write(std::ostream& OS, const llvm::Type& Thing) { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
68 Stream::writeType(OS, Thing); |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
69 } |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
70 static void write(std::ostream& OS, const llvm::Value& Thing) { |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
71 Stream::writeValue(OS, Thing); |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
72 } |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
73 }; |
1650 | 74 |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
75 // NOT IMPLEMENTED |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
76 char sfinae_bait(const llvm::Type&); |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
77 char sfinae_bait(const llvm::Value&); |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
78 short sfinae_bait(...); |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
79 }; |
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
80 |
1 | 81 namespace Logger |
82 { | |
83 void indent(); | |
84 void undent(); | |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1372
diff
changeset
|
85 Stream cout(); |
1372
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
86 void println(const char* fmt, ...) IS_PRINTF(1); |
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
87 void print(const char* fmt, ...) IS_PRINTF(1); |
38
27b2f40bdb58
[svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents:
1
diff
changeset
|
88 void enable(); |
27b2f40bdb58
[svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents:
1
diff
changeset
|
89 void disable(); |
131 | 90 bool enabled(); |
94
61615fa85940
[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
lindquist
parents:
38
diff
changeset
|
91 |
1372
229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents:
1228
diff
changeset
|
92 void attention(Loc loc, const char* fmt, ...) IS_PRINTF(2); |
1 | 93 |
94 struct LoggerScope | |
95 { | |
96 LoggerScope() | |
97 { | |
98 Logger::indent(); | |
99 } | |
100 ~LoggerScope() | |
101 { | |
102 Logger::undent(); | |
103 } | |
104 }; | |
105 } | |
106 | |
107 #define LOG_SCOPE Logger::LoggerScope _logscope; | |
38
27b2f40bdb58
[svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents:
1
diff
changeset
|
108 |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1124
diff
changeset
|
109 #define IF_LOG if (Logger::enabled()) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1124
diff
changeset
|
110 |
1 | 111 #endif |
112 |