llvm-project/lldb/scripts/checkpoint-llvm.pl
Sean Callanan 79763a42ab This commit integrates support for the LLVM MCJIT
into the mainline LLDB codebase.  MCJIT introduces
API improvements and better architectural support.

This commit adds a new subsystem, the
ProcessDataAllocator, which is responsible for
performing static data allocations on behalf of the
IR transformer.  MCJIT currently does not support
the relocations required to store the constant pool
in the same allocation as the function body, so we
allocate a heap region separately and redirect
static data references from the expression to that
heap region in a new IR modification pass.

This patch also fixes bugs in the IR
transformations that were exposed by the transition
to the MCJIT.  Finally, the patch also pulls in a
more recent revision of LLVM so that the MCJIT is
available for use.

llvm-svn: 131923
2011-05-23 21:40:23 +00:00

102 lines
3.6 KiB
Perl
Executable File

#!/usr/bin/perl
# This script should be pointed to a valid llvm.build folder that
# was created using the "build-llvm.pl" shell script. It will create
# a new llvm.zip file that can be checked into the respository
# at lldb/llvm.zip
use strict;
use Cwd 'abs_path';
use File::Basename;
use File::Temp qw/ tempfile tempdir /;
our $debug = 1;
sub do_command
{
my $cmd = shift;
my $description = @_ ? shift : "command";
my $die_on_fail = @_ ? shift : undef;
$debug and print "% $cmd\n";
system ($cmd);
if ($? == -1)
{
$debug and printf ("error: %s failed to execute: $!\n", $description);
$die_on_fail and $? and exit(1);
return $?;
}
elsif ($? & 127)
{
$debug and printf("error: %s child died with signal %d, %s coredump\n",
$description,
($? & 127),
($? & 128) ? 'with' : 'without');
$die_on_fail and $? and exit(1);
return $?;
}
else
{
my $exit = $? >> 8;
if ($exit)
{
$debug and printf("error: %s child exited with value %d\n", $description, $exit);
$die_on_fail and exit(1);
}
return $exit;
}
}
if (@ARGV == 4)
{
my $llvm_source_dir = abs_path(shift @ARGV); # The llvm source that contains full llvm and clang sources
my $llvm_build_dir = abs_path(shift @ARGV); # The llvm build directory that contains headers and
my $lldb_build_dir = abs_path(shift @ARGV); # the build directory that contains the fat libEnhancedDisassembly.dylib
my $llvm_zip_file = abs_path(shift @ARGV);
printf("LLVM sources : '%s'\n", $llvm_source_dir);
printf("LLVM build : '%s'\n", $llvm_build_dir);
printf("LLDB build : '%s'\n", $lldb_build_dir);
printf("LLVM zip file: '%s'\n", $llvm_zip_file);
-e $llvm_build_dir or die "LLVM build directory doesn't exist: '$llvm_build_dir': $!\n";
-l "$llvm_build_dir/llvm" || die "Couldn't find llvm symlink '$llvm_build_dir/llvm': $!\n";
my $temp_dir = tempdir( CLEANUP => 1 );
print "temp dir = '$temp_dir'\n";
my $llvm_checkpoint_dir = "$temp_dir/llvm";
mkdir "$llvm_checkpoint_dir" or die "Couldn't make 'llvm' in '$temp_dir'\n";
my @rsync_src_dst_paths =
(
"$llvm_source_dir/include", "$llvm_checkpoint_dir",
"$llvm_source_dir/tools/clang/include", "$llvm_checkpoint_dir/tools/clang",
"$llvm_build_dir/llvm/include", "$llvm_checkpoint_dir",
"$llvm_build_dir/llvm/tools/clang/include", "$llvm_checkpoint_dir/tools/clang",
);
while (@rsync_src_dst_paths)
{
my $rsync_src = shift @rsync_src_dst_paths;
my $rsync_dst = shift @rsync_src_dst_paths;
print "rsync_src = '$rsync_src'\n";
print "rsync_dst = '$rsync_dst'\n";
if (-e $rsync_src)
{
my ($rsync_dst_file, $rsync_dst_dir) = fileparse ($rsync_dst);
print "rsync_dst_dir = '$rsync_dst_dir'\n";
-e $rsync_dst_dir or do_command ("mkdir -p '$rsync_dst_dir'");
do_command ("rsync -amvC --exclude='*.tmp' --exclude='*.txt' --exclude='*.TXT' --exclude='*.td' --exclude='\.dir' --exclude=Makefile '$rsync_src' '$rsync_dst'");
}
}
do_command ("cp '$llvm_build_dir/libllvmclang.a' '$llvm_checkpoint_dir'", "Copying libllvmclang.a", 1);
do_command ("cp '$lldb_build_dir/libEnhancedDisassembly.dylib' '$llvm_checkpoint_dir'", "Copying libEnhancedDisassembly.dylib", 1);
do_command ("rm -rf '$llvm_zip_file'", "Removing old llvm checkpoint file '$llvm_zip_file'", 1);
do_command ("(cd '$temp_dir' ; zip -r '$llvm_zip_file' 'llvm')", "Zipping llvm checkpoint directory '$llvm_checkpoint_dir' to '$llvm_zip_file'", 1);
}
else
{
print "USAGE\n\tcheckpoint-llvm.pl <llvm-sources> <llvm-build> <lldb-build> <llvm-zip>\n\n";
print "EXAMPLE\n\tcd lldb\n\t./scripts/checkpoint-llvm.pl llvm build/llvm build/BuildAndIntegration llvm.zip\n";
}