annotate gen/programs.cpp @ 1499:df11cdec45a2

Another shot at fixing the issues with (constant) struct literals and their addresses. See DMD2682, #218, #324. The idea is to separate the notion of const from 'this variable can always be replaced with its initializer' in the frontend. To do that, I introduced Declaration::isSameAsInitializer, which is overridden in VarDeclaration to return false for constants that have a struct literal initializer. So {{{ const S s = S(5); void foo() { auto ps = &s; } // is no longer replaced by void foo() { auto ps = &(S(5)); } }}} To make taking the address of a struct constant with a struct-initializer outside of function scope possible, I made sure that AddrExp::optimize doesn't try to run the argument's optimization with WANTinterpret - that'd again replace the constant with a struct literal temporary.
author Christian Kamm <kamm incasoftware de>
date Sun, 14 Jun 2009 19:49:58 +0200
parents a376776e2301
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1299
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
1 #include "gen/programs.h"
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
2
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
3 #include "llvm/Support/CommandLine.h"
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
4 #include "llvm/System/Program.h"
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
5
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
6 #include "root.h" // error(char*)
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
7 #include "mars.h" // fatal()
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
8
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
9 using namespace llvm;
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
10
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
11 static cl::opt<std::string> gcc("gcc",
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
12 cl::desc("GCC to use for assembling and linking"),
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
13 cl::Hidden,
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
14 cl::ZeroOrMore);
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
15
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
16
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
17 sys::Path getGcc() {
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
18 const char *cc = NULL;
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
19
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
20 if (gcc.getNumOccurrences() > 0 && gcc.length() > 0)
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
21 cc = gcc.c_str();
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
22
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
23 if (!cc)
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
24 cc = getenv("CC");
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
25 if (!cc)
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
26 cc = "gcc";
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
27
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
28 sys::Path path = sys::Program::FindProgramByName(cc);
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
29 if (path.empty() && !cc) {
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
30 if (cc) {
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
31 path.set(cc);
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
32 } else {
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
33 error("failed to locate gcc");
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
34 fatal();
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
35 }
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
36 }
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
37
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
38 return path;
847b767b2d0b Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
diff changeset
39 }