[LLVMdev] The Next Win32 File System Problem

Greg Pettyjohn gregp at ccs.neu.edu
Sat May 6 19:30:47 PDT 2006


Fixing one bug uncovers the next one...

To reproduce:
 llvm-ar  rc ./libgcc.a libgcc/./_muldi3.o <and-lots-more-.o-files...>

The result:
  C:\msys\1.0\home\llvm_home\install\bin\llvm-ar.exe: Can't move './libgcc.a-000003' to './libgcc.a-000002': Cannot create a file when that file already exists.

So apparently, we're trying to move one file on top of another.

The error is generated in:

Path::renamePathOnDisk(const Path& newName) {
  if (!MoveFile(path.c_str(), newName.c_str()))
    ThrowError("Can't move '" + path +
               "' to '" + newName.path + "': ");
  return true;
}

I'm guessing that the last part of the error message ("Cannot create a
file when that file already exists") is the result of a GetLastError() ?

Here's a stack trace just before the exception is thrown:
Breakpoint 1, llvm::sys::Path::renamePathOnDisk(llvm::sys::Path const&) (
    this=0x22fc00, newName=@0x22fd20)
    at
C:/msys/1.0/home/llvm_home/llvm-build/../llvm/lib/System/Win32/Path.inc:685
685       if (!MoveFile(path.c_str(), newName.c_str()))
(gdb) n
686         ThrowError("Can't move '" + path +
(gdb) bt
#0  llvm::sys::Path::renamePathOnDisk(llvm::sys::Path const&)
(this=0x22fc00,
    newName=@0x22fd20)
    at
C:/msys/1.0/home/llvm_home/llvm-build/../llvm/lib/System/Win32/Path.inc:686
#1  0x004871c3 in llvm::Archive::writeToDisk(bool, bool, bool)
(this=0x3d5110,
    CreateSymbolTable=true, TruncateNames=false, Compress=false)
    at
C:/msys/1.0/home/llvm_home/llvm-build/../llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:461
#2  0x00403d4d in doReplaceOrInsert() ()
    at
C:/msys/1.0/home/llvm_home/llvm-build/../llvm/tools/llvm-ar/llvm-ar.cpp:645
#3  0x004042b5 in main (argc=64, argv=0x3d4ca0)
    at
C:/msys/1.0/home/llvm_home/llvm-build/../llvm/tools/llvm-ar/llvm-ar.cpp:704
(gdb)


So how to fix this?:
1. These are both temp files right? Why are we trying to overwrite an
existing file during a MoveFile? Can we just choose a different temp file
name that doesn't exist yet?

2. Is it deliberate? Should we be deleting the target file and then
performing the MoveFile?





More information about the llvm-dev mailing list