17
17
# Internal logger
18
18
_logger = logConfig (__name__ )
19
19
20
-
21
20
def wcompile (mode ):
22
21
""" The workhorse, called from wllvm and wllvm++.
23
22
"""
@@ -28,24 +27,29 @@ def wcompile(mode):
28
27
cmd = list (sys .argv )
29
28
cmd = cmd [1 :]
30
29
builder = getBuilder (cmd , mode )
30
+
31
+ af = builder .getBitcodeArglistFilter ()
32
+
31
33
rc = buildObject (builder )
32
34
33
35
# phase one compile failed. no point continuing
34
36
if rc != 0 :
35
37
_logger .info ('phase one failed: %s' , str (sys .argv ))
36
38
return rc
37
39
38
- # configure only; continuing not desired
39
- if os .environ .get ('WLLVM_CONFIGURE_ONLY' , False ):
40
+ # no need to generate bitcode (e.g. configure only, assembly, ....)
41
+ if af .skipBitcodeGeneration ():
42
+ _logger .info ('No work to do' )
43
+ _logger .debug (af .__dict__ )
40
44
return rc
41
45
42
46
# phase two
43
- buildAndAttachBitcode (builder )
47
+ buildAndAttachBitcode (builder , af )
44
48
45
49
except Exception as e :
46
50
_logger .warning ('%s: exception case: %s' , mode , str (e ))
47
51
48
- _logger .info ('Calling %s returned %d' , list (sys .argv ), rc )
52
+ _logger .info ('Calling %s returned %d' , list (sys .argv ), rc )
49
53
return rc
50
54
51
55
@@ -145,6 +149,7 @@ def attachBitcodePathToObject(bcPath, outFileName):
145
149
146
150
class BuilderBase (object ):
147
151
def __init__ (self , cmd , mode , prefixPath = None ):
152
+ self .af = None #memoize the arglist filter
148
153
self .cmd = cmd
149
154
self .mode = mode
150
155
@@ -180,7 +185,9 @@ def getCompiler(self):
180
185
return ['{0}{1}' .format (self .prefixPath , os .getenv (env ) or prog )]
181
186
182
187
def getBitcodeArglistFilter (self ):
183
- return ClangBitcodeArgumentListFilter (self .cmd )
188
+ if self .af is None :
189
+ self .af = ClangBitcodeArgumentListFilter (self .cmd )
190
+ return self .af
184
191
185
192
class DragoneggBuilder (BuilderBase ):
186
193
def getBitcodeCompiler (self ):
@@ -209,7 +216,9 @@ def getCompiler(self):
209
216
return ['{0}{1}{2}' .format (self .prefixPath , pfx , mode )]
210
217
211
218
def getBitcodeArglistFilter (self ):
212
- return ArgumentListFilter (self .cmd )
219
+ if self .af is None :
220
+ self .af = ArgumentListFilter (self .cmd )
221
+ return self .af
213
222
214
223
def getBuilder (cmd , mode ):
215
224
compilerEnv = 'LLVM_COMPILER'
@@ -242,15 +251,7 @@ def buildObject(builder):
242
251
243
252
244
253
# This command does not have the executable with it
245
- def buildAndAttachBitcode (builder ):
246
-
247
- af = builder .getBitcodeArglistFilter ()
248
-
249
-
250
- if not af .inputFiles or af .isEmitLLVM or af .isAssembly or af .isAssembleOnly or (af .isDependencyOnly and not af .isCompileOnly ) or af .isPreprocessOnly or af .isStandardIn :
251
- _logger .debug ('No work to do' )
252
- _logger .debug (af .__dict__ )
253
- return
254
+ def buildAndAttachBitcode (builder , af ):
254
255
255
256
#iam: when we have multiple input files we'll have to keep track of their object files.
256
257
newObjectFiles = []
0 commit comments