Skip to content

Commit dd36949

Browse files
committed
extract-bc gets a --manifest or -m flag
1 parent e637204 commit dd36949

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

extract-bc

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -139,18 +139,18 @@ def extract_section_linux(inputFile):
139139
return contents
140140

141141

142-
def handleExecutable(inputFile, outputFile, extractor, llvmLinker):
142+
def handleExecutable(inputFile, outputFile, extractor, llvmLinker, manifestFlag):
143143

144144
fileNames = extractor(inputFile)
145145

146146
if not fileNames:
147147
return 1
148-
149-
manifestFile = '{0}.occcam.manifest'.format(inputFile)
150148

151-
with open(manifestFile, 'w') as output:
152-
for f in fileNames:
153-
output.write('{0}\n'.format(f))
149+
if manifestFlag:
150+
manifestFile = '{0}.occcam.manifest'.format(inputFile)
151+
with open(manifestFile, 'w') as output:
152+
for f in fileNames:
153+
output.write('{0}\n'.format(f))
154154

155155
if outputFile == None:
156156
outputFile = inputFile + '.' + moduleExtension
@@ -179,7 +179,7 @@ def handleExecutable(inputFile, outputFile, extractor, llvmLinker):
179179

180180

181181

182-
def handleArchive(inputFile, outputFile, arCmd, fileType, extractor, llvmArchiver):
182+
def handleArchive(inputFile, outputFile, arCmd, fileType, extractor, llvmArchiver, manifestFlag):
183183
inputFile = os.path.abspath(inputFile)
184184
originalDir = os.getcwd() # This will be the destination
185185

@@ -237,6 +237,13 @@ def handleArchive(inputFile, outputFile, arCmd, fileType, extractor, llvmArchive
237237
# Delete the temporary folder
238238
logging.debug('Deleting temporary folder "{0}"'.format(tempDir))
239239
shutil.rmtree(tempDir)
240+
241+
#write the manifest file if asked for
242+
if manifestFlag:
243+
manifestFile = '{0}.occcam.manifest'.format(inputFile)
244+
with open(manifestFile, 'w') as output:
245+
for f in bitCodeFiles:
246+
output.write('{0}\n'.format(f))
240247

241248
# Build bitcode archive
242249
os.chdir(originalDir)
@@ -325,6 +332,9 @@ def extract_bc_args(args):
325332
parser.add_argument("--verbose","-v",
326333
help='Call the external procedures in verbose mode.',
327334
action="store_true")
335+
parser.add_argument("--manifest","-m",
336+
help='Write a manifest file listing all the .bc files used.',
337+
action="store_true")
328338
parser.add_argument("--output","-o",
329339
help='The output file. Defaults to a file in the same directory ' +
330340
'as the input with the same name as the input but with an ' +
@@ -337,11 +347,12 @@ def extract_bc_args(args):
337347
llvmLinker = parsedArgs.linker
338348
llvmArchiver = parsedArgs.archiver
339349
verboseFlag = parsedArgs.verbose
340-
350+
manifestFlag = parsedArgs.manifest
351+
341352
# Check file exists
342353
if not os.path.exists(inputFile):
343354
logging.error('File "{0}" does not exist.'.format(inputFile))
344-
return (False, inputFile, '', llvmLinker, llvmArchiver)
355+
return (False, inputFile, '', llvmLinker, llvmArchiver, manifestFlag)
345356

346357
# Check output destitionation if set
347358
outputFile = parsedArgs.output
@@ -351,34 +362,34 @@ def extract_bc_args(args):
351362
if not os.path.exists(os.path.dirname(outputFile)):
352363
logging.error('Output directory "{0}" does not exist.'.format(
353364
os.path.dirname(outputFile)))
354-
return (False, inputFile, '', llvmLinker, llvmArchiver)
365+
return (False, inputFile, '', llvmLinker, llvmArchiver, manifestFlag)
355366

356-
return (True, inputFile, outputFile, llvmLinker, llvmArchiver)
367+
return (True, inputFile, outputFile, llvmLinker, llvmArchiver, manifestFlag)
357368

358369

359370
def main(args):
360371

361-
(success, inputFile, outputFile, llvmLinker, llvmArchiver) = extract_bc_args(args)
372+
(success, inputFile, outputFile, llvmLinker, llvmArchiver, manifestFlag) = extract_bc_args(args)
362373

363374
if not success:
364375
return 1
365376

366377
if ( sys.platform.startswith('freebsd') or
367378
sys.platform.startswith('linux') ):
368379

369-
process_file_unix(inputFile, outputFile, llvmLinker, llvmArchiver)
380+
process_file_unix(inputFile, outputFile, llvmLinker, llvmArchiver, manifestFlag)
370381

371382
elif sys.platform.startswith('darwin'):
372383

373-
process_file_darwin(inputFile, outputFile, llvmLinker, llvmArchiver)
384+
process_file_darwin(inputFile, outputFile, llvmLinker, llvmArchiver, manifestFlag)
374385

375386
else:
376387
#iam: do we work on anything else?
377388
logging.error('Unsupported or unrecognized platform: {0}'.format(sys.platform))
378389
return 1
379390

380391

381-
def process_file_unix(inputFile, outputFile, llvmLinker, llvmArchiver):
392+
def process_file_unix(inputFile, outputFile, llvmLinker, llvmArchiver, manifestFlag):
382393
ft = FileType.getFileType(inputFile)
383394
logging.debug('Detected file type is {0}'.format(FileType.revMap[ft]))
384395

@@ -388,17 +399,17 @@ def process_file_unix(inputFile, outputFile, llvmLinker, llvmArchiver):
388399

389400
if ft == FileType.ELF_EXECUTABLE or ft == FileType.ELF_SHARED or ft == FileType.ELF_OBJECT:
390401
logging.info('Generating LLVM Bitcode module')
391-
return handleExecutable(inputFile, outputFile, extractor, llvmLinker)
402+
return handleExecutable(inputFile, outputFile, extractor, llvmLinker, manifestFlag)
392403
elif ft == FileType.ARCHIVE:
393404
logging.info('Generating LLVM Bitcode archive')
394-
return handleArchive(inputFile, outputFile, arCmd, ofileType, extractor, llvmArchiver)
405+
return handleArchive(inputFile, outputFile, arCmd, ofileType, extractor, llvmArchiver, manifestFlag)
395406
else:
396407
logging.error('File "{0}" of type {1} cannot be used'.format(inputFile,FileType.revMap[ft]))
397408
return 1
398409

399410

400411

401-
def process_file_darwin(inputFile, outputFile, llvmLinker, llvmArchiver):
412+
def process_file_darwin(inputFile, outputFile, llvmLinker, llvmArchiver, manifestFlag):
402413
ft = FileType.getFileType(inputFile)
403414
logging.debug('Detected file type is {0}'.format(FileType.revMap[ft]))
404415

@@ -408,10 +419,10 @@ def process_file_darwin(inputFile, outputFile, llvmLinker, llvmArchiver):
408419

409420
if ft == FileType.MACH_EXECUTABLE or ft == FileType.MACH_SHARED or ft == FileType.MACH_OBJECT:
410421
logging.info('Generating LLVM Bitcode module')
411-
return handleExecutable(inputFile, outputFile, extractor, llvmLinker)
422+
return handleExecutable(inputFile, outputFile, extractor, llvmLinker, manifestFlag)
412423
elif ft == FileType.ARCHIVE:
413424
logging.info('Generating LLVM Bitcode archive')
414-
return handleArchive(inputFile, outputFile, arCmd, ofileType, extractor, llvmArchiver)
425+
return handleArchive(inputFile, outputFile, arCmd, ofileType, extractor, llvmArchiver, manifestFlag)
415426
else:
416427
logging.error('File "{0}" of type {1} cannot be used'.format(inputFile,FileType.revMap[ft]))
417428
return 1

0 commit comments

Comments
 (0)